Activity状态保存异常:CheckBox状态丢失,savedInstanceState始终为null
解决CheckBox状态无法保存的问题
兄弟,我看你踩了个Android开发里的常见坑——onSaveInstanceState()和onRestoreInstanceState()根本不是给主动调用finish()这种场景用的!
为什么你的代码没效果?
这两个方法只有在Activity被系统意外销毁的时候才会触发:比如屏幕旋转、后台内存不足被系统强制回收。而你主动调用finish()属于Activity的正常销毁流程,系统完全不会触发onSaveInstanceState(),所以每次savedInstanceState都是null,自然没法恢复状态。
正确的解决方案:用持久化存储保存状态
既然是主动关闭Activity,我们需要把CheckBox的状态手动存到持久化存储里,比如SharedPreferences,这样下次打开Activity时就能读取并恢复状态了。
修改你的代码如下:
首先,添加SharedPreferences的初始化,以及保存、恢复状态的方法:
public class FilterRequestActivity extends AppCompatActivity { private CheckBox checkBox1; private CheckBox checkBox2; private CheckBox checkBox3; private CheckBox checkBox4; private CheckBox checkBox5; private Button button; private StringBuffer url=new StringBuffer(); private StringBuffer equalUrl=new StringBuffer(); private StringBuffer mainUrl=new StringBuffer(); private StringBuffer requestUrl=new StringBuffer(); // 新增SharedPreferences实例,用来持久化存储CheckBox状态 private SharedPreferences checkBoxPrefs; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_filter_request); // 初始化SharedPreferences,命名为FilterCheckBoxState checkBoxPrefs = getSharedPreferences("FilterCheckBoxState", MODE_PRIVATE); checkBox1=findViewById(R.id.one); checkBox2=findViewById(R.id.two); checkBox3=findViewById(R.id.three); checkBox4=findViewById(R.id.four); checkBox5=findViewById(R.id.five); button=findViewById(R.id.button); // 页面创建时立即恢复CheckBox的历史状态 restoreCheckBoxStates(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 返回前先保存当前CheckBox的状态 saveCheckBoxStates(); Intent returnIntent = new Intent(); returnIntent.putExtra("result", (CharSequence) requestUrl); setResult(Activity.RESULT_OK,returnIntent); finish(); } }); } public void onCheckBoxClicked(View view) { // 可选:如果想实时保存状态,每次用户点击CheckBox时就触发保存 saveCheckBoxStates(); } // 保存CheckBox状态到SharedPreferences private void saveCheckBoxStates() { SharedPreferences.Editor editor = checkBoxPrefs.edit(); editor.putBoolean("box1", checkBox1.isChecked()); editor.putBoolean("box2", checkBox2.isChecked()); editor.putBoolean("box3", checkBox3.isChecked()); editor.putBoolean("box4", checkBox4.isChecked()); editor.putBoolean("box5", checkBox5.isChecked()); editor.apply(); // 异步提交,性能更好;如果需要同步生效可以用commit() } // 从SharedPreferences恢复CheckBox状态 private void restoreCheckBoxStates() { // 第二个参数是默认值,第一次打开页面时CheckBox会处于未选中状态 checkBox1.setChecked(checkBoxPrefs.getBoolean("box1", false)); checkBox2.setChecked(checkBoxPrefs.getBoolean("box2", false)); checkBox3.setChecked(checkBoxPrefs.getBoolean("box3", false)); checkBox4.setChecked(checkBoxPrefs.getBoolean("box4", false)); checkBox5.setChecked(checkBoxPrefs.getBoolean("box5", false)); } // 可以保留原来的方法,处理系统意外销毁的场景(比如横竖屏切换) @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.e("FilterActivity","onSaveInstanceState is called"); outState.putBoolean("box1",checkBox1.isChecked()); outState.putBoolean("box2",checkBox2.isChecked()); outState.putBoolean("box3",checkBox3.isChecked()); outState.putBoolean("box4",checkBox4.isChecked()); outState.putBoolean("box5",checkBox5.isChecked()); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.e("FilterActivity","onRestoreInstanceState is called"); checkBox1.setChecked(savedInstanceState.getBoolean("box1")); checkBox2.setChecked(savedInstanceState.getBoolean("box2")); checkBox3.setChecked(savedInstanceState.getBoolean("box3")); checkBox4.setChecked(savedInstanceState.getBoolean("box4")); checkBox5.setChecked(savedInstanceState.getBoolean("box5")); } }
补充说明
- 如果你希望用户每次点击CheckBox时就实时保存状态,就在
onCheckBoxClicked方法里调用saveCheckBoxStates(),这样即使用户没点返回按钮就切到其他应用,状态也不会丢失。 - 原来的
onSaveInstanceState和onRestoreInstanceState可以保留,用来处理系统意外销毁的场景(比如突然横竖屏切换),和SharedPreferences的方案形成互补。
内容的提问来源于stack exchange,提问作者Sudhanshu Kaul
相关产品推荐
相关产品推荐

