sharedPreferences不会在活动之间共享

时间:2012-07-31 19:35:36

标签: android sharedpreferences

我正在尝试使用SharedPreferences来保存设置。但我似乎无法在我的任何活动之间共享数据。我正在使用的代码确实设法保存设置,但每个活动似乎都有自己的每个变量版本。

所以举个例子。我有一个音频设置活动,用户可以在其中为保存的变量“musicVolume”赋值。如果我关闭游戏并重新加载,则音频设置活动会“记住”该值。但是,如果我尝试将值加载到任何其他活动中,它将无效。但是,他们都可以加载并保存自己的同名变量。

这些是我用来保存变量的方法。每项活动都有这些方法的副本。**

正如我所说,它们起作用,但它们似乎只能读取和写入它们所在的个别活动的数据。

public void SavePreferences(String key, float value) {
        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putFloat(key, value);
        editor.commit();
}

public void LoadPreferences() {
        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
        musicVolume = sharedPreferences.getFloat("musicVolume", (float)0.123);
        soundEffectsVolume = sharedPreferences
                        .getFloat("soundEffectsVolume", (float)0.123);
}

public void ClearPreferences() {
        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.commit();
}

**我知道有更好的方法可以做到这一点,但我是一个非常新手的程序员。我试图遵循另一个线程的建议

Android Shared Preferences

但无论我在哪里尝试放行

protected AppPreferences appPrefs;
appPrefs = new AppPreferences(getApplicationContext());

我收到了某种错误。但最重要的是,阅读线程上的其他评论,人们都说无论如何,SharedPreferences会在同一个包中的活动之间自动共享,这就是我认为它们的工作方式。

5 个答案:

答案 0 :(得分:37)

您正在使用 getPreferences(MODE)。请改用 getSharedPreferences(“PREF_NAME”,MODE)。这样,您将为特定首选项提供名称,然后您可以通过其名称(此处为PREF_NAME)从您想要的任何活动中调用它。

//------get sharedPreferences

SharedPreferences pref = context.getSharedPreferences("PREF_NAME", Context.MODE_PRIVATE);

//-------get a value from them

pref.getString("NAME", "Android");

//--------modify the value

pref.edit().putString("NAME", "Simone").commit();

//--------reset preferences

pref.edit().clear().commit();

答案 1 :(得分:12)

如前所述,使用getSharedPreferences(String name, int mode)而不是getPreferences (int mode)。具体来说,如果您感兴趣,这两种方法的文档说明了区别。根据{{​​3}} getPreferences(int)执行以下操作:

  

检索SharedPreferences对象以访问其中的首选项   私人参加此活动。这只是调用底层证券   通过传入此活动的getSharedPreferences(String,int)方法   类名作为首选项名称。

答案 2 :(得分:7)

如果你没有做任何喜欢偏好的事情,我会使用默认的方式来访问它们。这似乎是你的问题。

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

这是一篇包含更多详细信息的精彩文章,除了获取句柄之外,您还可以正确地完成所有操作。 How do I get the SharedPreferences from a PreferenceActivity in Android?

另外:不要忘记新方法是调用.apply()而不是.commit() 这是#io2012视频中的一个......

答案 3 :(得分:2)

你应该使用这个

SharedPreferences pref = context.getSharedPreferences("PREF_NAME", Context.MODE_PRIVATE);

或者

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);

答案 4 :(得分:0)

如果你和我有同样的问题,那很简单。 当您要保存首选项时,请按以下方式保存:

SharedPreferences sp = getSharedPrefenreces("Preference",MODE_PRIVATE);

而不是:

 SharedPreferences sp = getSharedPrefenreces("Preference's name",Context.MODE_PRIVATE);

我知道在某些情况下,SharedPrefenrences有多重要。