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
相关产品推荐
相关产品推荐

