通过静态方法访问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
一种方法,( Activity
, Service
和其他类从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());
克里斯蒂安的答案是好的,但如果你想能够从任何地方访问你的共享喜好,正确的方法是:
- 创build
Application
一个子类,例如public class MyApp extends Application {
… - 在AndroidManifest.xml中设置你的
<application>
标签的android:name
属性指向你的新类,例如android:name="MyApp"
(所以这个类被Android识别) - 在应用程序实例的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。
- 类似于这里所build议的,创build一个扩展Application的类
- 让你的类的构造函数把Context作为参数。
- 使用您的上下文获取共享首选项并将其存储在私有variables中。
- 创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
-
用你需要的所有静态variables创build一个Settings类。
-
当应用程序初始化时,检索SharedPreferences字段并立即设置所有设置字段(我在MainActivity的onCreate方法的末尾调用了“loadSharedPrefs()”方法)。
-
在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); }