当前位置: 首页 > 知识库问答 >
问题:

保存复选框的状态,然后加载它

庄浩言
2023-03-14

我试图做的是,当按下主菜单上的按钮时,将设置菜单拉上(设置菜单作为独立于主菜单的活动实现)。为了简单起见,假设我的主菜单是空的,只有一个按钮打开设置菜单。在设置菜单中,有一个复选框和一个返回到主活动的“完成”按钮。

如何保存复选框并加载它(代码应该是什么,应该放在哪里,为什么等等)?我试着用谷歌搜索它,并试图复制结果,但我似乎无法得到它。到目前为止发生了两件事:没有保存任何内容,或者我的程序崩溃。

一旦我保存了关于复选框的信息,我如何能够从我的主要活动中访问这些信息@我希望能够基于用户是否选中了复选框来运行某些代码?

我已经登陆并尝试的一些结果:如何保存复选框状态?-Android保存复选框状态

(请记住,我对这个完全陌生)

public class Settings extends ActionBarActivity {

    private static final String SETTING_CHECK_BOX = "SETTINGS";
    private CheckBox cb;
    //char boxChecked = '0';
    @Override
    protected void onCreate(Bundle savedSettings) {
        super.onCreate(savedSettings);
        cb = (CheckBox) findViewById(R.id.checkBox);
        setContentView(R.layout.activity_settings);
        cb.setChecked(isCheckedSettingEnabled());
    }

    private void setCheckedSettingEnabled(boolean enabled) {
        PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean(SETTING_CHECK_BOX, enabled).apply();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_settings, menu);
        return true;
    }

    private boolean isCheckedSettingEnabled() {
        return PreferenceManager.getDefaultSharedPreferences(this).getBoolean(SETTING_CHECK_BOX, false);
    }

    public void onPause() {
        super.onPause();

        // Persist the setting. Could also do this with an OnCheckedChangeListener.
        setCheckedSettingEnabled(cb.isChecked());
    }

    public void clickedDone (View v) {
        SharedPreferences settings = getSharedPreferences("SETTINGS", 0);
        settings.edit().putBoolean("check",true).commit();
        finish();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

因此,现在我的应用不再崩溃,但状态不会被记住(当“设置”菜单打开时,总是取消选中)。我换了cb。将已检查(检查状态)设置为cb。setChecked(TRUE),它没有改变任何东西(当设置菜单打开时仍然始终未选中)。发生了什么事?

共有2个答案

朱宏爽
2023-03-14

一旦使用onSaveInstanceState()存储状态数据,系统将使用onRestoreInstanceState(Bundle SavedInstanceState)重新创建状态。

如果使用onSaveInstanceState(),则必须在“活动”中重写函数onRestoreInstanceState(),或在onCreate()中使用保存的状态。我认为最好使用onRestoreInstanceState(),它可以减少onCreate()中的代码,因为只有当系统关闭应用程序以腾出空间让新应用程序运行时,才会调用onSavedInstanceState()。如果只想保存选中状态,请使用共享首选项,无需onSaveInstanceState()//在课堂上

private  CheckBox cb;
private SharedPreferences preferences ;
private SharedPreferences.Editor editor;
private boolean CHECKED_STATE;
    @Override
    protected void onCreate(Bundle savedSettings) {
        super.onCreate(savedSettings);
        setContentView(R.layout.activity_settings);
        preferences = getApplicationContext().getSharedPreferences("PROJECT_NAME",                 android.content.Context.MODE_PRIVATE);
        editor = preferences.edit();
        CHECKED_STATE = preferences.getBoolean("check", false);
        cb = (CheckBox) findViewById(R.id.checkBox);
        cb.setChecked(CHECKED_STATE);
        cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
         @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
          editor.putBoolean("check", isChecked);
          editor.commit();
         }
        });
    }

   this code saves the state on clicking the check box.

要使其在按Back Press时保存状态,请将以下内容添加到“活动”中。

@Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
  editor.putBoolean("check", cb.isChecked());
              editor.commit();
}

有关保存实例状态的更多详细信息,请参阅此链接。

司马弘益
2023-03-14

onSaveInstanceState()仅用于持久化活动的该实例的数据。一旦调用了活动finish(),该状态就不再相关。您需要将设置写入持久存储。您的案例的简单存储解决方案是SharedReferences

public class Settings extends ActionBarActivity {
    // Create a constant for the setting that you're saving
    private static final String SETTING_CHECK_BOX = "checkbox_setting";

    private CheckBox mCheckBox;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        mCheckBox = (CheckBox) findViewById(R.id.checkBox);

        // Set the initial state of the check box based on saved value
        mCheckBox.setChecked(isCheckedSettingEnabled());
    }

    @Override
    public void onPause() {
        super.onPause();

        // Persist the setting. Could also do this with an OnCheckedChangeListener.
        setCheckedSettingEnabled(mCheckBox.isChecked());
    }

    /**
     * Returns true if the setting has been saved as enabled,
     * false by default
     */
    private boolean isCheckedSettingEnabled() {
        return PreferenceManager.getDefaultSharedPreferences(this)
                .getBoolean(SETTING_CHECK_BOX, false);
    }

    /**
     * Persists the new state of the setting
     * 
     * @param enabled the new state for the setting
     */
    private void setCheckedSettingEnabled(boolean enabled) {
        PreferenceManager.getDefaultSharedPreferences(this)
                .edit()
                .putBoolean(SETTING_CHECK_BOX, enabled)
                .apply();
    }
}

 类似资料:
  • 如果我打开活动,复选框始终保持选中状态,即使我取消选中它并离开活动或关闭应用程序,在重新启动活动后,它也将保持选中状态。 我已尝试使用以下代码段保存活动的状态。 复选框应始终处于用户离开它的状态(选中或未选中)。

  • 我正在开发一个android烹饪应用程序(使用java),主页有一个回收器视图,其中填充了用户可以喜欢的食谱(类似于FaceBook帖子)。喜欢按钮是一个复选框,保存每个食谱的喜欢复选框状态的最佳方式是什么,所以当用户退出应用程序并再次登录时,他们不会多次喜欢同一个食谱。 在这种情况下,使用SharedReference是一个好主意吗? **im使用MySql作为数据库,不使用firebase。

  • 问题内容: 我有一个列表视图,大约有200个项目,我为复选框实现了一个自定义ArrayAdapter。我使用SparseBooleanArray来存储盒子的值。 所有这些工作正常,但我似乎无法以图形方式更新复选框的检查。如果用户单击,则选中该框。但是,如果我在代码中调用setChecked,则它对框本身没有影响(因此,即使其值为true,也不会对其进行打勾)。 我通过尝试将所有框都设置为true并

  • 当html页面上没有任何变量可以切换时,是否有人知道如何使用selenium处理或读出复选框的状态(true/false)。我已经尝试了常用函数。isselected()和。isenabled(),但这些函数只读取不可用的值。 有人知道有没有办法得到这个身份吗?此外,xml的屏幕截图以及它是哪个元素。 如果有人有主意就太好了。我在用Java编程。

  • 我们使用的是Vaadin 8,我们有一个多选网格。在标题中有一个复选框,用作全选/取消全选复选框。问题是,窗口关闭后,标题复选框不会保持选中状态。E、 g.如果窗口打开,则选中标题复选框-

  • 我有一个带有复选框的列表,我在中应用了相同的行为 我的问题是,如果我先选中活动中的复选框,然后通过(模拟从服务器下载新数据)删除第一项,然后再次渲染,则选中第二个活动中的复选框。 当它不附加到实例时,的目的是什么。渲染工作正常,因为在控制台中打印的,所以被从第一运动移动到第二运动。