Android 共享首选项始终返回默认值

Android 共享首选项始终返回默认值,android,sharedpreferences,Android,Sharedpreferences,下面是我用来创建和存储首选值的代码。 传出是字符串变量 SharedPreferences sp = getSharedPreferences(outgoing, Activity.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("PhoneNo","Hi"); editor.commit(); 下面是从SharedReference获取值的代码 Share

下面是我用来创建和存储首选值的代码。 传出是字符串变量

SharedPreferences sp = getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();                
editor.putString("PhoneNo","Hi");
editor.commit();
下面是从SharedReference获取值的代码

SharedPreferences sp 
=getSharedPreferences(outgoing,Activity.MODE_PRIVATE);
String calln = sp.getString("PhoneNo","0");
Toast.makeText(mContext, "SHARED"+calln,Toast.LENGTH_LONG).show();

将此
活动。模式\u PRIVATE
更改为此
活动。模式\u MULTI\u PROCESS
,问题可能是由于存储值和访问值时的上下文不同造成的。

在放置值时,请尝试更改此项:

SharedPreferences sp = getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
为此:

SharedPreferences sp = getApplicationContext().getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
获取值时也一样-不要忘记在调用
SharedReferences时添加
getApplicationContext()

编辑:
检查两个活动中的“传出”字符串是否完全相同

您可能应该在访问它们的上下文中调用
getSharedReferences

因此,根据访问上下文的方式,如果将上下文传递给其他活动或异步任务,下面是一些用法示例:

this.getSharedPreferences(outgoing, Activity.MODE_PRIVATE);

context.getSharedPreferences(outgoing, Activity.MODE_PRIVATE);

getApplicationContext().getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
此外,您可以测试您的内容的一种方法是在
SharedReferences
发生更改时使用侦听器:

onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)

Called when a shared preference is changed, added, or removed.

您还可以使用
首选项管理器
获取
共享的首选项

PreferenceManager.getSharedPreferences(YOUR_CONTEXT).getString(
                    "PhoneNo", "0");
或存储它们:

PreferenceManager.getSharedPreferences(YOUR_CONTEXT).edit().putString(
                    "PhoneNo", "Hi").commit();

共享首选项始终返回默认值的最可能原因是您将该值保存在一个首选项文件中,然后尝试在另一个首选项文件中检索该值。如果从不同的活动调用
getPreferences()
,则可能会发生这种情况,因为
getPreferences()
会根据创建它的活动创建不同的首选项文件

解决方案 最简单的解决方案是始终按如下方式获取您的共享首选项:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
这将为整个应用程序使用一个首选项文件

替代溶液 如果出于某种原因需要使用不同的首选项文件,则可以这样做

final static String PREF_FILE_1 = "pref_file_1";
...
SharedPreferences sharedPref = context.getSharedPreferences(PREF_FILE_1, Context.MODE_PRIVATE);
只要确保您总是为您试图保存和检索的首选项使用正确的文件名即可

本地偏好 如果确实只需要特定活动的首选项,则可以使用
getPreferences(Context.MODE\u PRIVATE)
。只是不要期望能够以相同的方式从另一个活动中检索值

另见
  • 描述获取
    共享引用的各种方法之间的差异

您将此代码称为何处?是在同一个活动中还是在不同的活动中?谢谢回复。我已将其更改为Activity.MODE\u MULTI\u进程。但它仍然给我默认值。“此常量在API级别23中被弃用
MODE_MULTI_PROCESS
在Android的某些版本中无法可靠工作,而且没有提供任何机制来协调进程间的并发修改。应用程序不应尝试使用它。相反,他们应该使用一种显式的跨进程数据管理方法,如ContentProvider。“感谢回复。我添加了getApplicationContext,但结果没有差异,它仍然给我默认值。您正在调用检索方法(getString)吗?”来自同一个活动?不来自不同的活动。您确定使用的是“outing”的确切字符串值吗?您是否在两个活动中都声明了它?尝试用硬编码字符串替换outing(如“test”或其他内容)在两个活动中调用SP时,请查看是否有差异。哦..明白了。传出时出现一些问题。它正在使用“测试”。感谢您的帮助。我进行了更改,它将完成。:)