片段布尔值中的 SharedPreferences 未更新

SharedPreferences in fragment boolean value not updating

所以在我的 MainActivity 中,我在检查布尔值时使用 SharedPreferences 这样做。

  public boolean uptadevalues(boolean updatedvalue) {

        SharedPreferences preferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();


        if (mPremiumVQuery) {
            Log.d(TAG, "Called uptadevalues mPremiumVQuery");
            editor.putBoolean(mPremiumVString, true);
            editor.apply();
        } else {
            editor.putBoolean(mPremiumVString, false);
            editor.apply();
        }

        Log.d(TAG, "Called uptadevalues  ");

        return updatedvalue;
    }

我知道 mPremiumQuery 是正确的,因为 Log.d(TAG, "Called uptadevalues mPremiumVQuery"); 出现在 logcat 上。所以这意味着 SharedPreference 应该是 Writing 偏好。

在片段上:

    public boolean getPremiumValues() {

        Log.d(TAG, "getPremiumValues");
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
        return sp.getBoolean(mPremiumVString, false);

    }

然后点击按钮

 case R.id.button5:
                            if (getPremiumValues()) {
                            ** open activity **
                            } else {
                            **  dialog **  }

它总是显示对话框,但它确实应该打开新的 activity。 我看不出我的错误在哪里!感谢您的帮助。

更新:

问题是我使用不同的方法来访问 SharedPreferences,如@piotr.wittchen 所说。

有很多人说要从 commit() 更改;申请();我试过了,没有任何区别,建议使用 apply(); by google 我坚持了下来。

您的功能逻辑有问题或不完整。首先,你的名字有拼写错误。它是 uptadevalues,但可能应该是 updateValues。其次,你传递 boolean updatedvalue,然后你对这个值做 nothing 并且 return 它。这没有任何意义。在您的第一种方法中,您通过以下方式访问 SharedPreferences:

SharedPreferences preferences = getPreferences(MODE_PRIVATE);

但是在第二种方法中,您是这样访问它们的:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());

最好在两种情况下使用相同的方法访问 SharedPreferences。可能会导致数据不一致。尝试仅使用一个 SharedPreferences 实例。目前,您正在使用其中的许多。