我将一些信息存储为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代码气味吗?
提前致谢。
答案 0 :(得分:64)
Cristian的答案很好,但如果您希望能够从任何地方访问您的共享偏好,那么正确的方法是:
Application
的子类,例如public class MyApp extends Application {
... android:name
标记的<application>
属性,以指向您的新类,例如: android:name="MyApp"
(因此该类已被Android识别)this
)保存到名为app
的静态字段,并创建一个返回此字段的静态方法,例如getApp()
。然后,您可以稍后使用此方法获取应用程序的上下文,从而获得共享首选项。 : - )答案 1 :(得分:35)
那是因为在这种情况下,act
是您刚刚创建的对象。你必须让Android为你做这件事; getSharedPreferences()
是一种Context
,(Activity
,Service
的方法,其他类来自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)
这是在静态字段中存储共享首选项的更好选择。
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的静态引用的选项,但到目前为止这个解决方法已经足够了。
使用您需要的所有静态变量创建一个Settings类。
当应用程序初始化时,检索SharedPreferences字段并立即设置所有设置字段(我在MainActivity的onCreate方法结束时调用“loadSharedPrefs()”方法)。
在SettingsActivity的preferenceChangeListener初始化中,在Settings类中设置相应的静态字段。 (我在SettingsActivity的onPreferenceChange()开头调用了“setAppropriateSetting(key,value)”方法。
随时随地使用静态首选项!
答案 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);
}