我有一些信息储存作为控制你的电话和报文统计信息.我需要访问的信息来自外部邮件活动(从一个领域模型类)。所以我创造了一个静态的方法中的一项活动,我仅用于获取共享的偏好。

这是给我一些问题,因为显然这是不可能的叫法"getSharedPreferences"从静态的方法。

这里的消息日食给我

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

这个代码给零点例外。

是否有工作?我要进入一个安卓-码-闻起来,试图做到这一点?

在此先感谢。

有帮助吗?

解决方案

这是因为在这种情况下, act 一个目的是你刚刚建立。你必须让安卓为你做; 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());
    

其他提示

克里斯蒂安的回答是好,但如果你希望能够从访问你的共享偏好处处正确的方法是:

  1. 创建的 Application 时,例如一个子类public class MyApp extends Application { ...
  2. 设置在AndroidManifest.xml您android:name标签的<application>属性来指向自己的新类,例如android:name="MyApp"(因此类由Android识别)
  3. 在你的应用实例的onCreate()方法,节省的上下文(例如this)到名为app静态字段和创建一个静态方法,它返回这个字段,例如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;

存储的上下文为静态变量,会引起问题,因为当类被破坏等等都是静态变量。当应用程序被中断,成为内存低这有时会发生。只要确保你尝试使用它即使在类中设置的背景是随机销毁前的背景下始终设置。

下面就以存储在静态字段共享偏好一个更好的选择。

  1. 来什么已经在这里建议类似,创建可扩展应用程序类
  2. 请构造为类起飞上下文作为参数。
  3. 使用您的上下文来获取共享偏好并将其存储在私有变量。
  4. 创建公共变量返回所检索的数据。
  5. 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();
    

我有同样的需要--一些人的偏好需要访问的经常和效率。我也想,阅读和书写的字符串从控制你的电话和报文统计信息略慢于获取和设置一个静态的变量(但有可能微不足道的程度)。我也只是一种有用的,使用的是静态的领域,检索偏好的价值观只有在启动,并保存它们接近。

我不爱我的选择保持静态引用的控制你的电话和报文统计信息/情况下直接,但迄今为止这种解决办法已经足够了。

我的解决方案:

  1. 建立一个设置类的所有静态的变量需要。

  2. 当的应用程序初始化,获取控制你的电话和报文统计信息领域,并立即设置的所有设置领域(我叫"loadSharedPrefs()"方法结束时的重置的onCreate方法)。

  3. 在SettingsActivity的preferenceChangeListener的初始化,设置适当的静态现场的设置类。(I叫"setAppropriateSetting(键,值)"方法在开始SettingsActivity的onpreferencechange(偏好更换)()).

使用静态的偏好的地方,每当!

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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top