2012-07-19 9 views
11

Czy istnieje sposób na globalne udostępnianie SharedPreferences w całej mojej aplikacji? Obecnie używam tych linii w wielu miejscach w całym kodzie, aby przechowywać proste ustawienia włączania/wyłączania dla wielu preferencji, które moi użytkownicy mogą ustawić. Chcę tylko, aby połączyć je raz globalnie, jeśli to możliwe:Czy istnieje sposób na globalne udostępnianie SharedPreferences w całej mojej aplikacji na Androida?

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

wszelkie wskazówki dotyczące sposobu, aby móc nazwać tylko te linie we wszystkich klasach byłoby super:

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

i

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

Zobacz moją odpowiedź. Działa –

Odpowiedz

14

Wiem, wiem, zapalę się i wrzucę do żaru piekła ...

Użyj śpiewu Klasa leton który owija się wokół ustawienia SharedPreference .. coś takiego:

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

i tworzyć funkcje otoki wokół co się przykłady przedstawione w pytaniu, na przykład,

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

i realizacja mogłaby być coś takiego:

// Within Singleton class 

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

Od pierwszej aktywności aktywuj klasę singleton, W ten sposób, coś takiego:

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

Powodem zaryzykować dół głosowania, jest przy użyciu globalnych klas statycznych może być zły pomysł i sprzeczne z praktyką podstaw programowych. ALE powiedziawszy, że jako naiwny wybiórczy, zapewni, że tylko jeden obiekt klasy PrefSingleton może istnieć i będzie dostępny bez względu na to, jakie czynności wykonuje kod.

+2

Czy preferencje działają z kontekstem aplikacji? Wiele rzeczy nie, więc używanie go jest zawsze trudne. Również "pierwsza aktywność" jest nieco nieokreślona, ​​ponieważ aplikacja może być uruchomiona z transmisji, oczekującej intencji (widget itp.). –

+0

@NikolayElenkov jestem pewien, zgadzam się z tobą, pamiętaj, wstawiłem ogólny przykład, który był na czele mojej głowy ... mógł zostać zmodyfikowany, aby dopasować się do potrzeb. :) – t0mm13b

+2

Jeśli rozszerzysz aplikację, czy nie możesz zainicjować swojego singletona w swojej podklasie i uniknąć problemu "pierwszej aktywności"? – qix

9

Chciałbym przedłużyć Application i dołączyć SharedPreferences.Editor jako pole z gettera.

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

Następnie można uzyskać do niego dostęp z dowolnego Activity z

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

Alternatywnie, można również rzucać w metodzie

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

Chociaż byłoby to po prostu zmienić połączeń wprowadzone do

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

To naprawdę osobiste preferencje, które wyglądają dla ciebie czystsze.

+4

Podczas gdy to działa, za pomocą klasy aplikacji jest to przesada. Nie wspominając, że za każdym razem będziesz musiał rzucić go do swojej konkretnej klasy. Prosta klasa pomocnicza z metodami statycznymi, które pobierają parametr "Kontekst" (można po prostu przekazać "to" w działaniu) jest znacznie lepsza. Aplikacja tak naprawdę nic nie kupuje w tym przypadku. –

0

Użyj klasy Pomocnika, aby uzyskać wszystko, czego potrzebujesz, uczynić metody statycznymi. Tak właśnie działa ADW.

2

zrobiłbym to następujące:

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

      } 
} 

Następnie można przejść sharedPrefs ponieważ jest chroniony wtedy jest dostępne za pośrednictwem pakietu.

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

To jest moje ulubione rozwiązanie. – Ish

+0

Myślę, że to działałoby tylko wtedy, gdy wszystkie twoje działania rozszerzają BaseActivity. Co się stanie, jeśli masz Fragments lub ViewPagerAdapters, które potrzebujesz do przechowywania zmiennych? – Simon

+0

@Simon czy możesz po prostu rzucić swoją getActivity? ex, '((MainActivity) getActivity) getSharedPref();'? co ty na to? –

-1

Użyj tego, aby ustawić ustawienie:

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

I to, aby uzyskać ustawienie:

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

Aby przekazać kontekst można po prostu użyć this słowa kluczowego.

Ważne jest, aby wykonać , a nie przechowywać SharedPreferences jako zmienną statyczną. Jeśli to zrobisz, spowoduje to przeciek pamięci. Zobacz: http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html

Powiązane problemy