24

我正在尝试使用 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();
}

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

Android 共享首选项

但无论我试图把线条放在哪里

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

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

4

5 回答 5

45

您正在使用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();
于 2012-07-31T19:47:47.130 回答
12

如前所述,使用getSharedPreferences(String name, int mode)而不是getPreferences (int mode). 具体来说,如果您有兴趣,这两种方法的文档说明了差异。根据Android 文档 getPreferences(int),执行以下操作:

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

于 2012-07-31T20:51:26.047 回答
8

如果您没有对偏好做任何花哨的事情,我只会使用默认的访问方式。好像是你的问题。

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

这是一篇更详细的精彩文章,除了掌握你的句柄外,你所做的一切都非常正确。 如何从 Android 中的 PreferenceActivity 获取 SharedPreferences?

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

于 2012-07-31T19:51:27.683 回答
2

你应该使用这个

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

或者

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
于 2013-09-27T08:52:00.103 回答
1

如果你和我有同样的问题,那很简单。当你去保存首选项时,像这样保存它:

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

并不是:

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

我知道在某些情况下 SharedPfenrences 有多么重要。

于 2015-11-26T02:19:41.730 回答