我在SharedPreferences中保存对象布尔值时遇到问题。对象(ArrayList"questions"的一部分(包含布尔值">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();
}
首先,我在活动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,即使我正在访问问题。
不要这样做:
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或任何语言设计程序。这是在你学习编程基础知识之后的内容。