2012-07-19 9 views
11

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

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

素晴らしいだろう、すべてのクラスにちょうどこれらの行を呼び出すことができるようにする方法上の任意のヒントを:

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

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

私の答えを参照してください。それは動作します –

答えて

14

私は知っている、私は炎症を取得し、地獄の燃え盛りにキャストします....

SharedPreference設定を包むletonクラス..このような何か:

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

私はダウン投票リスク理由、グローバル静的クラスを使用することは悪い考えすることができているとプログラミングの基礎の練習に反します。 BUTによれば、コードはどんなアクティビティであっても、クラスの1つの唯一のオブジェクトが存在し、アクセシブルであることが保証されます。

+2

設定はアプリケーションのコンテキストで動作しますか?多くのことはしません、それを使用することは常に難しいです。また、アプリは放送、保留中の意図(ウィジェットなど)から開始できるため、「最初のアクティビティ」は未定義です。 –

+0

@NikolayElenkov確かに、私はそこに同意します、覚えています、私は頭の上にある一般的な例を入れました...それは自分の必要性に合わせて変更することができます。 :) – t0mm13b

+2

アプリケーションを拡張すると、サブクラスでシングルトンを初期化できず、「最初のアクティビティ」の問題を回避できませんでしたか? – qix

9

私は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; 
    } 
} 

その後、あなたはまた

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

で任意のActivityからアクセスすることができます、また法

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

に投げることができ

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

それは本当にあなたにとってよりきれいに見える個人的な好みです。

+4

これは機能しますが、これに対してアプリケーションクラスを使用することは過剰です。毎回あなたの具体的なクラスにキャストする必要があることは言うまでもありません。 'Context'パラメータを取る静的メソッドを持つ簡単なヘルパークラス(アクティビティ中に' this'を渡すことができます)がはるかに優れています。このアプリケーションでは、実際にあなたに何も買わない。 –

0

ヘルパークラスを使用して必要なものをすべて取得し、メソッドを静的にします。これがADWの動作です。

2

私は次のようにこれを行うだろう:それはパッケージを介してアクセス可能ですその後、保護されているため、その後sharedPrefsにアクセスすることができます

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

      } 
} 

In the console you have : true <-- setInhistory 
+0

これは私のお気に入りの解決策です。 – Ish

+0

これは、BaseActivityを拡張したすべてのアクティビティがある場合にのみ機能すると思います。変数を格納する必要があるFragmentsまたはViewPagerAdapterがある場合はどうなりますか? – Simon

+0

@SimonあなたはgetActivityをキャストできますか? ex、 '((MainActivity)getActivity)getSharedPref();'?どのようにそのことについて? –

-1

設定を設定するには、これを使用します。

public static void SetCheckedSetting(Context context, String value) 
{ 
    SharedPreferences settings = getSharedPreferences("prefs", 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putString("examplesetting", value); 
    editor.commit(); 
} 

そして、この設定を取得する:あなたは、単にthisキーワードを使用することができ、コンテキストを渡すには

public static String GetCheckedSetting(Context context) 
{ 
    SharedPreferences settings = getSharedPreferences("prefs", 0); 
    return settings.getString("examplesetting", ""); 
} 

を。

ではなく、SharedPreferencesという静的変数に格納することが重要です。そうすると、メモリリークが発生します。参照:http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html

関連する問題