【问题标题】:sharedPreferences won't share between activitiessharedPreferences 不会在活动之间共享
【发布时间】:2012-07-29 16:00:12
【问题描述】:

我正在尝试使用 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 Shared Preferences

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

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

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

【问题讨论】:

  • “某种错误”。不要发布类似的东西。请更明确。告诉我们错误。无论如何,您是否创建了一个名为 AppPreferences 的类?因为它不是 Android 类。
  • 你找到答案了吗?
  • 正确答案就在下面dude :: here by @Niraj Burde,请标记为正确答案。我试过了

标签: android sharedpreferences


【解决方案1】:

您正在使用 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();

【讨论】:

  • 不错,干净的答案。谢谢老兄:)
  • @BiskremMuhammad thanxx :)
【解决方案2】:

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

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

这是一篇很棒的文章,其中包含更多细节,除了掌握你的句柄之外,你所做的一切都非常正确。 How do I get the SharedPreferences from a PreferenceActivity in Android?

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

【讨论】:

  • 我不知道,所以我google了一下:to call .apply() instead of .commit(),不同的是apply()没有返回一个表示提交是否成功的布尔值,因此由于asycn所以更快。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    你应该使用这个

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

    或者

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
    

    【讨论】:

    • 我在 MySharedPreferences 类中使用 context.getSharedPreferences()。但它不适用于清除 sharedPreferences 变量并退出应用程序。你有什么建议吗?
    【解决方案5】:

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

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

    而不是:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 2017-10-25
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多