SharedPreferences 没有更新它的值
SharedPreferences is not updating its value
下面是我在保存设置函数 (DialogFragment) 中使用的代码片段:
String orderBy = mOrderBySpinner.getSelectedItem().toString();
String search = mSearchEditText.getText().toString().trim();
SharedPreferences sharedPreferences = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(InventoryPreferences.ORDER_BY, orderBy);
editor.putString(InventoryPreferences.SEARCH_TERM, search);
editor.apply();
然后我使用以下 (Activity) 检索该数据:
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
String orderBy = sharedPrefs.getString(InventoryPreferences.ORDER_BY, "name ASC");
String searchTerm = sharedPrefs.getString(
InventoryPreferences.SEARCH_TERM,"").trim();
这些是我的钥匙:
public static final String ORDER_BY = "orderBy";
public static final String SEARCH_TERM = "search";
是否有任何原因说明当密钥相同时为什么不更新值?
getActivity().getPreferences(Context.MODE_PRIVATE);
不是
PreferenceManager.getDefaultSharedPreferences(this);
两种方法都使用第二行。
来自文档:
https://developer.android.com/reference/android/app/Activity.html#getPreferences(int)
Retrieve a SharedPreferences object for accessing preferences that are
private to this activity
使用 PreferenceManager
访问 SharedPreference。
您更新首选项值的代码是正确的。
考虑验证输入控件中的值是否真的改变了
并验证该应用程序是否有权写入首选项。
您正在使用两种不同的方法来访问 SharedPreferences
文件。
第一次使用 getActivity().getPreferences(Context.MODE_PRIVATE)
时,您正在调用 Activity 的 getPreferences(int mode)
,其中 returns 一个 SharedPreferences 对象,它应该是 [=29= 私有的] 请求它。此 SharedPreferences 对象指向的首选项文件的名称是 CLASS_NAME.xml
第二次使用PreferenceManager.getDefaultSharedPreferences(this)
returns 一个 SharedPreferences 对象,它应该对整个应用程序可用且有用。此 SharedPreferences 对象指向的首选项文件的名称是 PACKAGE_NAME_preferences.xml.
所以您的问题是您使用一个文件写入首选项,而另一个文件读取它们。尝试使用更全局的思维 PreferenceManager.getDefaultSharedPreferences(Context context)
来存储与整个应用程序相关的首选项,并且仅使用 Activity.getPreferences(int mode)
来存储仅与特定 activity 相关的首选项。 (然后还要记得用合适的方法找回)
下面是我在保存设置函数 (DialogFragment) 中使用的代码片段:
String orderBy = mOrderBySpinner.getSelectedItem().toString();
String search = mSearchEditText.getText().toString().trim();
SharedPreferences sharedPreferences = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(InventoryPreferences.ORDER_BY, orderBy);
editor.putString(InventoryPreferences.SEARCH_TERM, search);
editor.apply();
然后我使用以下 (Activity) 检索该数据:
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
String orderBy = sharedPrefs.getString(InventoryPreferences.ORDER_BY, "name ASC");
String searchTerm = sharedPrefs.getString(
InventoryPreferences.SEARCH_TERM,"").trim();
这些是我的钥匙:
public static final String ORDER_BY = "orderBy";
public static final String SEARCH_TERM = "search";
是否有任何原因说明当密钥相同时为什么不更新值?
getActivity().getPreferences(Context.MODE_PRIVATE);
不是
PreferenceManager.getDefaultSharedPreferences(this);
两种方法都使用第二行。
来自文档: https://developer.android.com/reference/android/app/Activity.html#getPreferences(int)
Retrieve a SharedPreferences object for accessing preferences that are private to this activity
使用 PreferenceManager
访问 SharedPreference。
您更新首选项值的代码是正确的。
考虑验证输入控件中的值是否真的改变了 并验证该应用程序是否有权写入首选项。
您正在使用两种不同的方法来访问 SharedPreferences
文件。
第一次使用 getActivity().getPreferences(Context.MODE_PRIVATE)
时,您正在调用 Activity 的 getPreferences(int mode)
,其中 returns 一个 SharedPreferences 对象,它应该是 [=29= 私有的] 请求它。此 SharedPreferences 对象指向的首选项文件的名称是 CLASS_NAME.xml
第二次使用PreferenceManager.getDefaultSharedPreferences(this)
returns 一个 SharedPreferences 对象,它应该对整个应用程序可用且有用。此 SharedPreferences 对象指向的首选项文件的名称是 PACKAGE_NAME_preferences.xml.
所以您的问题是您使用一个文件写入首选项,而另一个文件读取它们。尝试使用更全局的思维 PreferenceManager.getDefaultSharedPreferences(Context context)
来存储与整个应用程序相关的首选项,并且仅使用 Activity.getPreferences(int mode)
来存储仅与特定 activity 相关的首选项。 (然后还要记得用合适的方法找回)