切换片段后共享首选项为空

时间:2013-07-15 07:52:24

标签: android android-fragments sharedpreferences

我的共享偏好有一个非常奇怪的问题。我正在使用它们来存储用户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();

5 个答案:

答案 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。