【问题标题】:SharedPreferences not saving boolean attributeSharedPreferences 不保存布尔属性
【发布时间】: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,即使我正在访问问题。

【问题讨论】:

    标签: android json arraylist boolean sharedpreferences


    【解决方案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 或任何语言设计程序。这是您学习了编程基础知识之后的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多