【问题标题】:How to save the state of a checkbox without extra variables?如何在没有额外变量的情况下保存复选框的状态?
【发布时间】:2012-01-02 18:56:06
【问题描述】:

我在 6 个活动中有 100 多个不同的复选框,我想保存每个活动的状态,这样当我从一个活动切换到另一个活动时,它仍然处于选中状态。我真的必须创建 100 多个布尔值来分别保存每个复选框,还是有更简单的方法来保存和读出状态?我想过使用循环,但我真的想不出一个聪明的方法来做到这一点。如果有人可以提供帮助,那就太好了! 这是我的复选框之一的示例:它应该在框被点击时将字符串添加到 ArrayList 对象,并在框未被选中时删除字符串。它工作正常,但是当我离开时。 Actvity1,进入 Activity2 并返回到 Acivity1 取消选中我的一个复选框,该字符串第二次添加到我的 ArrayList 中,而不是被删除。

    myBox1.setOnClickListener(new OnClickListener() {
        @Override

        public void onClick(View v) {
            if (myBox1.isChecked() == true)
                helperActivity.myStringArrayList.add("myString1");

            else {
        helperActivity.myStringArrayList.remove("myString1");}
        }           
    });

【问题讨论】:

    标签: java android state checkbox


    【解决方案1】:

    一种选择是使用Shared Preferences 来保存每个复选框的选中状态。

    // Access the default SharedPreferences
    SharedPreferences preferences = 
      PreferenceManager.getDefaultSharedPreferences(this);
    
    ...
    
    SharedPreferences.Editor editor = preferences.edit();
    // Save the checked state
    editor.putBoolean("myBox1", true);
    editor.commit();
    
    ...
    
    // Get and set the checked state
    boolean myBox1State = preferences.getBoolean("myBox1", false);
    myBox1.setChecked(myBox1State);
    

    此方案的优点是这些设置将在应用程序重新启动后继续存在。

    【讨论】:

    • 效果很好,但是,当我回到之前选中复选框的活动时,绿色勾号不再存在。所以我认为系统现在得到了它,但我怎样才能将它连接到视图?
    • @C.Mandy 假设您正确保存了首选项,当您显示活动时,您是否设置了它的选中状态?查看我编辑的帖子。
    【解决方案2】:

    如果复选框的数量相同,则保留一个布尔数组

    【讨论】:

    • 很遗憾没有。如果需要我会改变它们,但我想知道是否没有更简单的方法可以避免它......
    【解决方案3】:

    您可以使用全局 HashMap 将复选框的 id 映射到其状态。然后,您将 Checkbox 子类化,根据需要覆盖以将状态保存/恢复到 Map 中,并在 xml 文件中使用您的类。 然后,您可以在应用启动时保存和恢复地图,使用它来写入文件:

            file = context.openFileOutput("checkbox_state.prefs", Context.MODE_PRIVATE);
            objectOutputStream = new ObjectOutputStream(file);
            objectOutputStream.writeObject(myCheckboxesState);
    

    这是从一个读取:

            file = context.openFileInput("checkbox_state.prefs");
            objectInputStream = new ObjectInputStream(file);
            myCheckboxesState = (Map<Integer, Boolean>) objectInputStream.readObject();
    

    从我的脑海中,我认为这是最好的方法。

    【讨论】:

      猜你喜欢
      • 2021-01-11
      • 2010-11-16
      • 2017-08-10
      • 1970-01-01
      • 2017-09-14
      • 2013-01-11
      • 2018-03-05
      • 2018-12-28
      • 1970-01-01
      相关资源
      最近更新 更多