//在一个片段中
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
SharedPreferences.Editor editor = preferences.edit();
editor.putString("aKeyString", "aValueString");
editor.apply()
//If I try to log the just saved value the log is empty. Though I thought the apply(); committed that value to memory instantly and later to disc. So should be readable ?
Log.d(TAG, preferences.getString("aKeyString",""));
//nothing is logged to logcat at all. Not even a blank line.
然而,在另一个片段中,我需要读取该值但返回null。
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
Log.d(TAG, "value: " + preferences.getString("aKeyString",""));
//Logs out "value: null"
为什么它为空?我正在使用getDefaultSharedPreferences
,这将确保我正在访问正确的数据,getActivity().getApplicationContext()
出于同样的原因。
关于SO的类似问题关于返回null的首选项的帖子建议使用:
'应用();'而不是'commit();'我已经是。 要么 他们建议使用'getDefaultSharedPreferences'而不是'getSharedPreferences',我也是。
为什么它为空?
答案 0 :(得分:4)
我认为您应该使用活动的上下文,而不是getApplicationContext()
它们都是Context的实例,但应用程序实例与应用程序的生命周期相关联,而Activity实例与Activity的生命周期相关联。因此,他们可以访问有关应用程序环境的不同信息。
您可以获取片段内相关活动的上下文,例如:
private Context ctx;
@Override
public void onAttach(Context context) {
super.onAttach(context);
ctx = context;
}
然后你需要它做的事情:
preferences = PreferenceManager.getDefaultSharedPreferences(ctx);
答案 1 :(得分:4)
你正在以正确的方式做到这一点,顺便说一句,你说它显示“null”而你指定了一个默认的空字符串值,根据javadoc应该是不可能的:
/**
* Retrieve a String value from the preferences.
*
* @param key The name of the preference to retrieve.
* @param defValue Value to return if this preference does not exist.
*
* @return Returns the preference value if it exists, or defValue. Throws
* ClassCastException if there is a preference with this name that is not
* a String.
*
* @throws ClassCastException
*/
@Nullable
String getString(String key, @Nullable String defValue);
你确定它不会在这里抛出异常并解释为什么你看不到日志行吗?
我建议您使用
boolean commit();
并检查返回值。不幸的是,apply方法将其更改提交到内存中,但是启动了对磁盘的异步提交,并且不会通知您任何失败。
答案 2 :(得分:0)
使用此代码
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
SharedPreferences.Editor editor = preferences.edit();
editor.putString(“aKeyString”,“aValueString”); editor.commite()