我的共享偏好有一个非常奇怪的问题。我正在使用它们来存储用户ID,不同的设置等。我正在使用一个活动来切换片段,如果用户点击了菜单中的项目(我正在使用Menu-Drawer)。
每次登录后,我都会存储用户个人资料。这很完美。执行此操作后,我可以重新启动应用程序,从内存中删除它,我甚至可以重启我的设备,我的值仍然存储。但是当我切换片段时,例如我在主视图中并单击菜单中的“关于应用程序”,一切都消失了。我的价值观是空的。
它变得更奇怪:如果我在主视图中选择了主项目时强制活动重新加载片段,它仍然存储。只有当我用不同类型的片段替换它时,一切都会丢失。
我不知道为什么应用程序会像这样。它们都在相同的上下文相同的活动中。我总是使用getActivity来获取片段中的上下文。
这是我存储代码的简化代码段。
public static void storeUserProfile(Context context, LoginEvent event, String userId, String emailAddress, String passwordHash) {
SharedPreferences userPrefs = context.getSharedPreferences(AppConfig.USER_PREFS, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = userPrefs.edit();
editor.clear();
editor.putString("username", event.userName);
editor.putString("id", userId);
editor.putString("email", emailAddress);
editor.commit();
}
这是我切换片段的方式:
HomeFeedFragment fragment = new HomeFeedFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.commit();
答案 0 :(得分:4)
尝试使用此代码段,可以从应用中的所有活动/片段中访问它。
首先声明这些方法..
public static void putPref(String key, String value, Context context) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(key, value);
editor.commit();
}
public static String getPref(String key, Context context) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getString(key, null);
}
当你想要一个pref:
时,请调用它putPref("myKey", "mystring", getApplicationContext());
当你想获得一个pref时调用它:
getPref("myKey", getApplicationContext());
答案 1 :(得分:1)
使用片段,仅对getSharedPreferences()
不起作用
PreferenceManager.getDefaultSharedPreferences (getActivity ());
答案 2 :(得分:0)
非常感谢您的快速回复!我自己发现了这个错误。对于about视图,我正在加载一个html文件,该文件也将存储在共享首选项中。我还没想过共享偏好只是一个xml文件,所以我认为html字符串使得xml文件无效。
我注意到my prefs.getString(key, defaultValue)
没有返回defaultValue,他们返回一个空字符串。所以我已经删除了html存储,并以不同的方式执行此操作。
但是谢谢你的评论!
答案 3 :(得分:0)
我遇到了同样的问题,我通过更改共享偏好的密钥字符串解决了
我正在使用:
SharedPreferences userPrefs = context.getSharedPreferences("MuslimActive", Context.MODE_PRIVATE);
我换了:
SharedPreferences userPrefs = context.getSharedPreferences("muslim_active", Context.MODE_PRIVATE);
答案 4 :(得分:-1)
默认情况下禁用任何超过2.3和MODE_MULTI_PROCESS的内容,如果存在相同SharedPreferences的多个实例,则需要设置MODE_MULTI_PROCESS。
尝试:
getSharedPreferences(AppConfig.USER_PREFS, Context.MODE_MULTI_PROCESS);
此外,请确保在方法调用中始终使用AppConfig.USER_PREFS。