有没有办法使共享首选项在我的整个Android应用程序中具有全局性?

2022-09-03 17:44:35

有没有办法使共享首选项在整个应用程序中具有全局性?现在,我在代码中的很多地方使用这些行来存储简单的开/关设置,以存储我的用户可以设置的许多首选项。如果可能的话,我只想在全球范围内称呼他们一次:

SharedPreferences settings = getSharedPreferences("prefs", 0);
SharedPreferences.Editor editor = settings.edit();

关于如何能够在所有课程中仅调用这些线路的任何提示都将很棒:

editor.putString("examplesetting", "off");
editor.commit(); 

String checkedSetting = settings.getString("examplesetting", "");

答案 1

我知道,我知道,我会被激怒,扔进地狱的余烬里。

使用环绕设置的单例类。像这样:SharedPreference

public class PrefSingleton{
   private static PrefSingleton mInstance;
   private Context mContext;
   //
   private SharedPreferences mMyPreferences;

   private PrefSingleton(){ }

   public static PrefSingleton getInstance(){
       if (mInstance == null) mInstance = new PrefSingleton();
       return mInstance;
   }

   public void Initialize(Context ctxt){
       mContext = ctxt;
       //
       mMyPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
   }
}

并围绕您的示例在问题中表示的内容创建包装函数,例如,

PrefSingleton.getInstance().writePreference("exampleSetting", "off");

实现可以是这样的:

// Within Singleton class

public void writePreference(String key, String value){
     Editor e = mMyPreference.edit();
     e.putString(key, value);
     e.commit();
}

从您的第一个活动开始,以这种方式激活单例类,如下所示:

PrefSingleton.getInstance().Initialize(getApplicationContext());

我冒着落票的风险的原因是,使用全局静态类可能是一个坏主意,并且违背了编程基础的做法。话虽如此,撇开挑剔不谈,它将确保只有类的唯一对象可以存在并且无论代码处于什么活动中都可以访问。PrefSingleton


答案 2

我会扩展并包括作为一个带有getter的字段。ApplicationSharedPreferences.Editor

public class APP extends Application {
    private final SharedPreferences settings = getSharedPreferences("prefs", 0);
    private final SharedPreferences.Editor editor = settings.edit();

    public SharedPreferences.Editor editSharePrefs() {
        return editor;
    }
}

然后,您可以从任何Activity

((APP) getApplication()).editSharePrefs().putString("examplesetting", "off");
((APP) getApplication()).editsharePrefs().commit();

或者,您也可以输入该方法

    public static APP getAPP(Context context) {
        return (APP) context.getApplicationContext();
    }

虽然,这只会改变你拨打的电话

APP.getAPP(this).editSharePrefs().putString("examplesetting", "off");
APP.getAPP(this).editsharePrefs().commit();

所以这真的是个人喜好,对你来说看起来更干净。


推荐