通过静态方法访问SharedPreferences

时间:2010-09-27 17:03:44

标签: android android-activity static-methods sharedpreferences

我将一些信息存储为SharedPreferences。我需要从外部的Activity(从域模型类中)访问该信息。所以我在Activity中创建了一个静态方法,我只用它来获取共享首选项。

这给了我一些问题,因为显然无法从静态方法调用方法“getSharedPreferences”。

以下是eclipse给我的信息:

Cannot make a static reference to the non-static method 
getSharedPreferences(String, int) from the type ContextWrapper

我尝试使用Activity实例来解决这个问题,如下所示:

public static SharedPreferences getSharedPreferences () {
  Activity act = new Activity();
  return act.getSharedPreferences("FILE", 0);
}

此代码提供零点异常。

有解决方法吗?我试图这样做会进入一个Android代码气味吗?

提前致谢。

6 个答案:

答案 0 :(得分:64)

Cristian的答案很好,但如果您希望能够从任何地方访问您的共享偏好,那么正确的方法是:

  1. 创建Application的子类,例如public class MyApp extends Application { ...
  2. 在AndroidManifest.xml中设置android:name标记的<application>属性,以指向您的新类,例如: android:name="MyApp"(因此该类已被Android识别)
  3. 在应用实例的onCreate()方法中,将您的上下文(例如this)保存到名为app的静态字段,并创建一个返回此字段的静态方法,例如getApp()。然后,您可以稍后使用此方法获取应用程序的上下文,从而获得共享首选项。 : - )

答案 1 :(得分:35)

那是因为在这种情况下,act是您刚刚创建的对象。你必须让Android为你做这件事; getSharedPreferences()是一种Context,(ActivityService的方法,其他类来自Context)。所以,你必须做出选择:

  • 如果方法位于活动或其他类型的上下文中:

    getApplicationContext().getSharedPreferences("foo", 0);
    
  • 如果方法不在活动或其他类型的上下文中:

    // you have to pass the context to it. In your case:
    // this is inside a public class
    public static SharedPreferences getSharedPreferences (Context ctxt) {
       return ctxt.getSharedPreferences("FILE", 0);
    }
    
    // and, this is in your activity
    YourClass.this.getSharedPreferences(YourClass.this.getApplicationContext());
    

答案 2 :(得分:7)

我有类似的问题,我通过简单地将当前上下文传递给静态函数来解决它:

public static void LoadData(Context context)
{
    SharedPreferences SaveData = context.getSharedPreferences(FILENAME, MODE_PRIVATE);
    Variable = SaveData.getInt("Variable", 0);
    Variable1 = SaveData.getInt("Variable1", 0);
    Variable2 = SaveData.getInt("Variable2", 0);
}

由于您是从活动外部呼叫,因此您需要保存上下文:

public static Context context;

在OnCreate中:

context = this;

将上下文存储为静态变量会导致问题,因为当类被销毁时,静态变量也是如此。当应用程序被中断并且内存不足时,有时会发生这种情况。只要确保在尝试使用它之前始终设置上下文,即使设置上下文的类是随机销毁的。

答案 3 :(得分:4)

这是在静态字段中存储共享首选项的更好选择。

  1. 与此处建议的内容类似,创建一个扩展Application
  2. 的类
  3. 使您的类的构造函数将Context作为参数。
  4. 使用您的上下文获取共享首选项并将其存储在私有变量中。
  5. 创建公共变量以返回检索到的数据。
  6. e.g

    public class UserInfo extends Application{
        private String SAVED_USERID;
        private String SAVED_USERNAME;
    
        public UserInfo(Context context) {
            SharedPreferences prefs = context.getSharedPreferences(FILE, MODE_PRIVATE);
            SAVED_USERNAME = prefs.getString("UserName", null);
            SAVED_USERID = prefs.getString("UserID", null);
        }
    
        public String getSavedUserName() {
            return SAVED_USERNAME;
        }
    
        public String getSavedUserID() {
             return SAVED_USERID;
        }
    }
    

    活动中的用法

       UserInfo user = new UserInfo(this.getApplicationContext());
    
       String SAVED_USERNAME = user.getSavedUserName();
       String SAVED_USERID = user.getSavedUserID();
    

答案 4 :(得分:2)

我有同样的需求 - 我的一些偏好需要经常,有效地访问。我还想象从SharedPreferences读取和写入字符串比获取和设置静态变量稍微慢一点(但可能是微不足道的程度)。我也习惯于使用静态字段,仅在启动时检索Preference值,并在关闭时保存它们。

我不喜欢直接保留对SharedPreferences / contexts的静态引用的选项,但到目前为止这个解决方法已经足够了。

我的解决方案:

  1. 使用您需要的所有静态变量创建一个Settings类。

  2. 当应用程序初始化时,检索SharedPreferences字段并立即设置所有设置字段(我在MainActivity的onCreate方法结束时调用“loadSharedPrefs()”方法)。

  3. 在SettingsActivity的preferenceChangeListener初始化中,在Settings类中设置相应的静态字段。 (我在SettingsActivity的onPreferenceChange()开头调用了“setAppropriateSetting(key,value)”方法。

  4. 随时随地使用静态首选项!

答案 5 :(得分:0)

public static String getPreferenceValue(Context context) {
    SharedPreferences sharedPreferences = 
        PreferenceManager.getDefaultSharedPreferences(context);
    String key = context.getString(R.string.pref_key);
    String defaultVal = context.getString(R.string.pref_default);
    return sharedPreferences.getString(key,defaulVal);
}