【问题标题】:Using saveinstancestate for saving a lot of checkbox states使用 saveinstancestate 保存大量复选框状态
【发布时间】:2015-06-29 15:55:05
【问题描述】:

我知道有很多关于使用保存实例状态的文档,但我对如何为我的案例实施它感到困惑。我的活动有自定义操作栏,带有自定义按钮,可将您带到上一页和下一页。当我通过这些按钮导航时,我希望能够保存所有复选框的状态。我 90% 确定我做错了,我想知道考虑到我使用的行数是否有更好的方法。这段代码在我的第一个活动中,当我点击我的自定义下一个按钮,然后点击上一个按钮返回它时,它没有保存状态:

boolean bPrearrival_1, bPrearrival_2, bPrearrival_3, bPrearrival_4, bPrearrival_5,
        bPrearrival_6, bPrearrival_7, bPrearrival_8, bPrearrival_9, bPrearrival_10,
        bPrearrival_11, bPrearrival_12;

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putBoolean("prearrival_1", checkboxList.get(0).isChecked());
    savedInstanceState.putBoolean("prearrival_2", checkboxList.get(1).isChecked());
    savedInstanceState.putBoolean("prearrival_3", checkboxList.get(2).isChecked());
    savedInstanceState.putBoolean("prearrival_4", checkboxList.get(3).isChecked());
    savedInstanceState.putBoolean("prearrival_5", checkboxList.get(4).isChecked());
    savedInstanceState.putBoolean("prearrival_6", checkboxList.get(5).isChecked());
    savedInstanceState.putBoolean("prearrival_7", checkboxList.get(6).isChecked());
    savedInstanceState.putBoolean("prearrival_8", checkboxList.get(7).isChecked());
    savedInstanceState.putBoolean("prearrival_9", checkboxList.get(8).isChecked());
    savedInstanceState.putBoolean("prearrival_10", checkboxList.get(9).isChecked());
    savedInstanceState.putBoolean("prearrival_11", checkboxList.get(10).isChecked());
    savedInstanceState.putBoolean("prearrival_12", checkboxList.get(11).isChecked());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    bPrearrival_1 = savedInstanceState.getBoolean("prearrival_1");
    bPrearrival_2 = savedInstanceState.getBoolean("prearrival_2");
    bPrearrival_3 = savedInstanceState.getBoolean("prearrival_3");
    bPrearrival_4 = savedInstanceState.getBoolean("prearrival_4");
    bPrearrival_5 = savedInstanceState.getBoolean("prearrival_5");
    bPrearrival_6 = savedInstanceState.getBoolean("prearrival_6");
    bPrearrival_7 = savedInstanceState.getBoolean("prearrival_7");
    bPrearrival_8 = savedInstanceState.getBoolean("prearrival_8");
    bPrearrival_9 = savedInstanceState.getBoolean("prearrival_9");
    bPrearrival_10 = savedInstanceState.getBoolean("prearrival_10");
    bPrearrival_11 = savedInstanceState.getBoolean("prearrival_11");
    bPrearrival_12 = savedInstanceState.getBoolean("prearrival_12");
}

@Override
protected void onResume() {
    super.onResume();
    checkboxList.get(0).setChecked(bPrearrival_1);
    checkboxList.get(1).setChecked(bPrearrival_2);
    checkboxList.get(2).setChecked(bPrearrival_3);
    checkboxList.get(3).setChecked(bPrearrival_4);
    checkboxList.get(4).setChecked(bPrearrival_5);
    checkboxList.get(5).setChecked(bPrearrival_6);
    checkboxList.get(6).setChecked(bPrearrival_7);
    checkboxList.get(7).setChecked(bPrearrival_8);
    checkboxList.get(8).setChecked(bPrearrival_9);
    checkboxList.get(9).setChecked(bPrearrival_10);
    checkboxList.get(10).setChecked(bPrearrival_11);
    checkboxList.get(11).setChecked(bPrearrival_12);

}

【问题讨论】:

  • savedInstanceState 不是 SharedPreference。
  • @hegazy 哎呀,好像我打算使用 savedInstanceState 而不是 SharedPreference 来编写。我也不太了解,您知道解决我的问题的最佳方法是什么吗?

标签: android checkbox sharedpreferences savestate


【解决方案1】:

我会使用更少的代码

void saveChecListStateInPreference(){

SharedPreferences preferences =  PreferenceManager.getDefaultSharedPreferences(this);
String PREARRIVAL_PREFIX = "prearrival_";
String checkValue = "";
SharedPreferences.Editor editor =  preferences.edit();

//Total length of your checkboxes
for(int i = 0 ; i< 11 ; i++){
    checkValue = PREARRIVAL_PREFIX + String.valueOf(i+1);//Because it is no zero based where you started
    preferences.putBoolean(checkValue,checkboxList.get(i).isChecked())
}
editor.apply();

}

你几乎可以用同样的方式恢复

【讨论】:

  • 感谢您的回复,putBoolean 是否有原因给出无法解决的错误?我还要在哪里调用这个方法?
  • 您可以在 onPause() 或 onStop() 上调用它,但注意不要存储太多值,因为它在 UI 线程上运行,这是一个如何使用它的示例SharePreferenrece Example
猜你喜欢
  • 2012-04-18
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
相关资源
最近更新 更多