如何将文本框输入值与SharedPreferences存储的历史值正确存入字符串数组
问题原因
现存代码的核心错误是:没有将SharedPreferences中已存储的历史JSON字符串反序列化为字符串列表,而是直接将整个JSON串作为普通字符串追加到了新列表中,每次存储都会嵌套一层JSON序列化,最终就会出现多层转义符的异常结果。
修复后的代码
import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; // 具体业务逻辑部分 SharedPreferences mPrefs = getContext().getSharedPreferences("k-texts", Context.MODE_PRIVATE); SharedPreferences.Editor prefsEditor = mPrefs.edit(); Gson gson = new Gson(); // 1. 读取历史存储的JSON,反序列化为列表 String historyJson = mPrefs.getString("k-text", ""); Type listType = new TypeToken<ArrayList<String>>(){}.getType(); ArrayList<String> listOfTexts; try { listOfTexts = gson.fromJson(historyJson, listType); } catch (Exception e) { // 解析失败(比如首次存储无历史数据)时初始化空列表 listOfTexts = new ArrayList<>(); } // 2. 追加本次新输入的内容 String inputText = Objects.requireNonNull(_customTextField.getText()).toString(); listOfTexts.add(inputText); // 3. 序列化后回存到SharedPreferences String updatedJson = gson.toJson(listOfTexts); prefsEditor.putString("k-text", updatedJson); prefsEditor.apply();
可选优化建议
- 如果要限制历史记录的最大条数,可以在追加新内容后判断列表长度,超过阈值时删除最旧的第一条记录即可
- 可根据业务需求对输入内容做去重判断,避免重复存储相同的输入值
内容的提问来源于stack exchange,提问作者xRay
相关产品推荐
相关产品推荐

