sharedPreferences返回null值

时间:2016-03-04 10:32:19

标签: android android-fragments sharedpreferences

//在一个片段中

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',我也是。

为什么它为空?

3 个答案:

答案 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()