2012-07-31 6 views
62

Sto cercando di leggere SharedPreferences all'interno di Fragment. Il mio codice è quello che uso per ottenere le preferenze in qualsiasi altra attività.SharedPreferences Android in Fragment

 SharedPreferences preferences = getSharedPreferences("pref", 0); 

ottengo errore

Cannot make a static reference to the non-static method getSharedPreferences(String, int) from the type ContextWrapper  

ho cercato di seguire questi link, ma senza fortuna Accessing SharedPreferences through static methods e Static SharedPreferences. Grazie per qualsiasi soluzione.

risposta

176

Il metodo getSharedPreferences è un metodo dell'oggetto Context, pertanto la semplice chiamata di getSharedPreferences da un Fragment non funzionerà ... perché non è un contesto! (L'attività è un'estensione di Context, quindi possiamo chiamarci getSharedPreferences).

modo da avere per ottenere il vostro applicazioni Contesto da

// this = your fragment 
SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE); 
+1

getSharedPreferences ("pref", 0); zero (0) significa che privato/pubblico? – Kailas

+0

@Kailas corretti, la modalità, ad esempio WORLD_READABLE ect. http://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String, int) – Jug6ernaut

+0

quale tipo di modalità ho utilizzato le preferenze condivise solo l'accesso da tale applicazione nessuna altra applicazione leggi/scrivi i valori delle preferenze condivise? – Kailas

4

Come nota di cautela questa risposta fornita dall'utente sopra di me è corretto.

SharedPreferences preferences = this.getActivity().getSharedPreferences("pref",0); 

Tuttavia, se si tenta di ottenere qualcosa nel frammento prima onAttach è chiamato getActivity() restituirà null.

+1

e l'attività non è completamente inizializzata finché non viene chiamato onActivityCreated ... – hotzen

9

La risposta marcata non ha funzionato per me, ho dovuto usare

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 

EDIT:

O semplicemente provare a rimuovere la this:

SharedPreferences prefs = getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE); 
+3

La risposta contrassegnata non ha funzionato per te perché stai accedendo alle preferenze condivise predefinite. Un design migliore è quello di memorizzare le tue preferenze non come oggetti condivisi, ma in uno spazio separato e privato, che è ciò di cui trattano la domanda e la risposta. – zeeshan

0

È possibile effettuare la SharedPrefences in onAttach metodo del frammento come questo:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    SharedPreferences preferences = context.getSharedPreferences("pref", 0); 
}