SharedPreferences 不保存布尔属性
Posted
技术标签:
【中文标题】SharedPreferences 不保存布尔属性【英文标题】:SharedPreferences not saving boolean attribute 【发布时间】:2020-08-02 00:57:38 【问题描述】:我在 SharedPreferences 中保存布尔对象时遇到问题。该对象(ArrayList“问题”的一部分)包含一个布尔值“recentAnswer”。 如果我更改布尔值并想在另一个活动中使用它,则该值仍然是旧的。
这是我在活动 1 中的 saveData 方法:
private void saveData()
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(questions);
editor.putString("task list", json);
editor.apply();
我在这里使用它来保存更改后的布尔值(活动 1):
private void checkAnswer(Button answerButton)
if (answerButton.getText().equals(questions.get(currentQuestion).getAnswer1()))
questions.get(currentQuestion).recentAnswer = true;
else
questions.get(currentQuestion).recentAnswer = false;
Toast.makeText(this, Boolean.toString(questions.get(currentQuestion).recentAnswer), Toast.LENGTH_SHORT).show();
saveData();
首先,我在 Activity 2 中加载 ArrayList:
private void loadData()
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("task list", null);
Type type = new TypeToken<ArrayList<Question>>().getType();
questions = gson.fromJson(json, type);
if(questions == null)
questions = new ArrayList<>();
然后我想获取“recentAnswer”值(活动 2):
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_statistics);
loadData();
for (Question element : questions)
int recentWrong;
if (!element.recentAnswer)
recentWrong++;
Toast.makeText(this, Integer.toString(recentWrong), Toast.LENGTH_SHORT).show();
不管我如何更改活动 1 中的值,在活动 2 中“recentWrong”始终 = 0,即使我正在访问问题。
【问题讨论】:
【参考方案1】:不要这样做:
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(questions);
editor.putString("task list", json);
永远不要这样做。首先是你没有检查并且不知道价值问题可能包含什么,你也不应该在 SharedPrefs 中保存类似的东西。
如果您有多个问题,则将每个问题连同其响应一起保存在 SharedPrefs 中,并且如果您需要保存一个您希望稍后在代码中检查的答案,请使用存储在 res->strings.xml 中的字符串值。 如果问题太长,想办法连接它或使用 res->string-arrays.xml 并将问题保留在那里,然后从那里引用它们。
您需要回过头来看看如何用 Java、Kotlin 或任何语言设计程序。这是您学习了编程基础知识之后的内容。
【讨论】:
以上是关于SharedPreferences 不保存布尔属性的主要内容,如果未能解决你的问题,请参考以下文章
如何从复选框数组中保存布尔状态并在使用 SharedPreferences 加载适配器时加载它们的状态