有没有办法让SharedPreferences在我的整个Android应用程序中全局化?

时间:2012-07-19 01:02:48

标签: java android android-preferences

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

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

关于如何在所有类中调用这些行的任何提示都很棒:

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

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

4 个答案:

答案 0 :(得分:15)

我知道,我知道,我会被激怒,并被投入地狱的余烬中......

使用包含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的唯一对象可以存在并且无论代码处于什么活动都可以访问。< / p>

答案 1 :(得分:10)

我会扩展Application并将SharedPreferences.Editor作为带有getter的字段包含在内。

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

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

答案 2 :(得分:3)

我会这样做:

public class BaseActivity extends Activity {

        protected boolean setInHistory;
        protected SharedPreferences sharedPrefs;

            @Override
        protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    setInHistory = true;
       }


}


public class MainActivity extends BaseActivity {

         public void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

              System.out.println(setInHistory+" <-- setInhistory");

          }
}

然后可以访问sharedPrefs,因为它受到保护,然后可以通过包访问。

In the console you have : true <-- setInhistory

答案 3 :(得分:0)

使用Helper类获取所需的所有内容,使方法保持静态。这就是ADW的用法。