2

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

5 回答 5

5

试试这个片段,它可以从你应用中的所有活动/片段中访问。

先声明这些方法..

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);
}

然后当你想放一个首选项时调用它:

putPref("myKey", "mystring", getApplicationContext());

当你想得到一个首选项时调用这个:

 getPref("myKey", getApplicationContext());
于 2013-07-15T08:03:05.967 回答
1

使用片段,getSharedPreferences()仅与 PreferenceManager.getDefaultSharedPreferences (getActivity ());

于 2016-02-13T01:50:35.513 回答
0

我有同样的问题,我通过更改我的sharedpreferences的密钥字符串解决了

我正在使用:

SharedPreferences userPrefs = context.getSharedPreferences("MuslimActive", Context.MODE_PRIVATE);

我改变了:

SharedPreferences userPrefs = context.getSharedPreferences("muslim_active", Context.MODE_PRIVATE);
于 2015-04-15T14:13:35.470 回答
0

非常感谢您的快速回复!我自己发现了错误。对于 about 视图,我正在加载一个 html 文件,该文件也将存储在共享首选项中。我没有想到 sharedpreferences 只是一个 xml 文件的事实,所以我认为 html 字符串使 xml 文件无效。

我注意到my prefs.getString(key, defaultValue)没有返回默认值,而是返回了一个空字符串。所以我删除了 html 存储并以不同的方式执行此操作。

但是谢谢你的评论!

于 2013-07-15T08:55:28.247 回答
-1

超过 2.3 和 MODE_MULTI_PROCESS 的任何内容默认禁用,如果存在相同 SharedPreferences 的多个实例,则需要设置 MODE_MULTI_PROCESS。

尝试:

getSharedPreferences(AppConfig.USER_PREFS, Context.MODE_MULTI_PROCESS);

此外,请确保您在方法调用中始终使用 AppConfig.USER_PREFS。

于 2013-07-15T08:03:15.877 回答