13

アプリ全体で SharedPreferences をグローバルにする方法はありますか? 現在、コード全体の多くの場所でこれらの行を使用して、ユーザーが設定できる多くの設定の単純なオン/オフ設定を保存しています。可能であれば、一度グローバルに呼び出したいだけです。

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

すべてのクラスでこれらの行だけを呼び出す方法に関するヒントは素晴らしいでしょう:

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

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

4 に答える 4

19

わかってるわかってる、炎上して地獄の燃えさしに放り込まれてしまう……。

設定をラップするシングルトン クラスを使用し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、コードがどのようなアクティビティにあるかに関係なく、クラスの唯一のオブジェクトのみが存在し、アクセスできることを保証します。

于 2012-07-19T01:16:15.780 に答える
11

ゲッターを使用してフィールドとして拡張Applicationして含めます。SharedPreferences.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();

つまり、どちらがきれいに見えるかは個人的な好みです。

于 2012-07-19T01:29:03.097 に答える
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 が保護されているため、パッケージからアクセスできるため、sharedPrefs にアクセスできます。

In the console you have : true <-- setInhistory
于 2013-03-14T20:35:20.450 に答える
0

Helperクラスを使用して必要なものをすべて取得し、メソッドを静的にします。これがADWの方法です。

于 2012-07-19T02:25:00.907 に答える