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

jos*_*usa 2 android sharedpreferences android-fragments

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

这就是我切换片段的方式:

HomeFeedFragment fragment = new HomeFeedFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

kc *_*ili 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);
}
Run Code Online (Sandbox Code Playgroud)

然后在您想放置首选项时调用它:

putPref("myKey", "mystring", getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

当你想获得一个偏好时调用它:

 getPref("myKey", getApplicationContext());
Run Code Online (Sandbox Code Playgroud)