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

Android开发:读取SharedPreferences生成动态按钮为何仅得1个

问题原因

  • 核心原因是SharedPreferences存储逻辑不符合预期:你存储按钮文本时,直接将包含["1","2","3"]的JSON数组作为单个键值对存入了k-texts配置文件,而非将3个按钮文本分别作为独立的键值对存储。调用mPrefs.getAll()返回的Map中仅包含1条数据,遍历循环仅执行1次,因此只会生成1个按钮,按钮文本就是完整的JSON数组字符串。
  • 代码存在潜在风险:你针对SDK版本 >= Android M(6.0)才初始化SharedPreferences和Button对象的判断逻辑完全不必要,这两个API在更低版本系统就已支持,如果运行设备系统版本低于6.0,会直接触发空指针崩溃。

修复方案

可二选一适配:

方案1:修改存储逻辑,将按钮文本作为独立键值对存储

存储时参考如下代码:

SharedPreferences.Editor editor = getContext().getSharedPreferences("k-texts", Context.MODE_PRIVATE).edit();
editor.putString("btn_1", "1");
editor.putString("btn_2", "2");
editor.putString("btn_3", "3");
editor.apply();

原有读取生成按钮的代码可直接复用,仅需去掉多余的SDK版本判断即可。

方案2:保留数组存储逻辑,读取时先解析JSON数组

如果确实需要以数组形式存储,读取时先解析JSON字符串再循环生成按钮:

LinearLayout layout = view.findViewById(R.id.root);
SharedPreferences mPrefs = getContext().getSharedPreferences("k-texts", Context.MODE_PRIVATE);
// 替换为你存储数组时对应的键名,示例为btn_array
String btnTextArrayStr = mPrefs.getString("btn_array", "[]");
try {
    JSONArray textArray = new JSONArray(btnTextArrayStr);
    for (int i = 0; i < textArray.length(); i++) {
        Button btn = new Button(getContext());
        btn.setText(textArray.getString(i));
        btn.setTextColor(Color.BLUE);
        btn.setBackgroundColor(Color.RED);
        layout.addView(btn);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

内容的提问来源于stack exchange,提问作者xRay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:54:03