通过静态方法访问SharedPreferences

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

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

这是eclipse给我的消息:

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

我试图通过使用一个活动的实例来解决这个问题,就像这样:

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

这段代码给出了一个空点exception。

有没有解决办法? 我想通过尝试这样做到Android的代码气味?

提前致谢。

那是因为在这种情况下, act是你刚刚创造的一个对象。 你必须让Android为你做到这一点; getSharedPreferences()Context一种方法,( ActivityService和其他类从Context延伸)。 所以,你必须做出你的select:

  • 如果方法在活动或其他types的上下文中:

     getApplicationContext().getSharedPreferences("foo", 0); 
  • 如果该方法在活动或其他types的上下文之外:

     // 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()); 

克里斯蒂安的答案是好的,但如果你想能够从任何地方访问你的共享喜好,正确的方法是:

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

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

 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; 

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

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

  1. 类似于这里所build议的,创build一个扩展Application的类
  2. 让你的类的构造函数把Context作为参数。
  3. 使用您的上下文获取共享首选项并将其存储在私有variables中。
  4. 创build公共variables来返回检索的数据。

例如

 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(); 

我有同样的需求 – 我的一些偏好需要经常访问,并有效地。 我也想象从SharedPreferences读写string比获取和设置一个静态variables稍微慢一点(但可能是一个微不足道的程度)。 我也只是习惯于使用静态字段,只在启动时检索首选项值,并将它们保存在closures状态。

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

我的解决scheme

  1. 用你需要的所有静态variables创build一个Settings类。

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

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

随时随地使用您的静态偏好!

 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); }