You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:35:18