片段布尔值中的 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 实例。目前,您正在使用其中的许多。
所以在我的 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 实例。目前,您正在使用其中的许多。