Android Studio中如何在用户退出APP后保存AlertDialog复选框状态
实现退出APP后保存AlertDialog多选复选框状态
要解决这个问题,核心是在初始化对话框时读取已保存状态,并在用户确认选择后将状态持久化到SharedPreferences,以下是修正后的完整实现:
关键修改点
- 启动时从SharedPreferences读取之前保存的选项状态,而非默认全为false
- 在多选点击回调中维护选中项列表
- 点击确定按钮时将当前选中状态写入SharedPreferences
修正后的代码
private AlertDialog showAlertDialog() { // 获取专属SharedPreferences实例,私有模式确保仅本APP可访问 SharedPreferences prefs = getSharedPreferences("DayPreferences", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); ArrayList<Integer> selectedItems = new ArrayList<>(); AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); alertDialog.setTitle("Selecione o dia"); String[] days = {"Domingo","Segunda-Feira","Terça-Feira","Quarta-Feira","Quinta-Feira", "Sexta-Feira","Sabado"}; // 从SharedPreferences读取历史选中状态,初始化复选框数组 boolean[] checkedItems = new boolean[days.length]; for (int i = 0; i < days.length; i++) { checkedItems[i] = prefs.getBoolean("day_" + i, false); // 若历史状态为选中,同步加入选中列表 if (checkedItems[i]) { selectedItems.add(i); } } alertDialog.setMultiChoiceItems(days, checkedItems, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int i, boolean isChecked) { if (isChecked) { selectedItems.add(i); } else { selectedItems.remove(Integer.valueOf(i)); } } }); alertDialog.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { // 遍历所有选项,将当前选中状态写入SharedPreferences for (int i = 0; i < days.length; i++) { editor.putBoolean("day_" + i, selectedItems.contains(i)); } editor.apply(); // 异步保存,避免阻塞UI线程 Toast.makeText(MainActivity.this, "Dia(s) registrado(s)", Toast.LENGTH_LONG).show(); } }); alertDialog.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { // 取消操作不保存状态,直接关闭对话框 } }); AlertDialog alert = alertDialog.create(); alert.setCanceledOnTouchOutside(false); alert.show(); return alert; }
补充说明
- 使用
day_+索引作为每个选项的存储key,确保每个选项状态独立且唯一 editor.apply()为异步保存操作,相比同步的commit()更适合在UI线程中使用- 初始化时同步选中列表与历史状态,确保对话框打开时正确显示之前的选择
内容的提问来源于stack exchange,提问作者Elvio Prado
相关产品推荐
相关产品推荐

