2010-04-10 20 views
328

Sto usando un PreferenceActivity per mostrare alcune impostazioni per la mia applicazione. Sto gonfiare le impostazioni tramite un file XML in modo che il mio onCreate (e metodi della classe completi) aspetto:Come si ottengono le preferenze condivise da un'Attività di preferenza in Android?

public class FooActivity extends PreferenceActivity { 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     addPreferencesFromResource(R.xml.preference); 
    } 
} 

Javadoc di PreferenceActivityPreferenceFragment afferma che

Queste preferenze verranno salvate automaticamente a SharedPreferences come l'utente interagisce con loro. Per recuperare un'istanza di SharedPreferences che verrà utilizzata dalla gerarchia delle preferenze in questa attività, chiamare getDefaultSharedPreferences (android.content.Context) con un contesto nello stesso pacchetto di questa attività.

Ma come ottengo il nome di SharedPreference in un'altra attività? Posso solo chiamare

getSharedPreferences(name, mode) 

in altra attività, ma ho bisogno il nome del SharedPreference che è stato utilizzato dal PreferenceActivity. Qual è il nome o come posso recuperarlo?

risposta

666
import android.preference.PreferenceManager; 
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
// then you use 
prefs.getBoolean("keystring", true); 

Aggiornamento

Secondo Shared Preferences | Android Developer Tutorial (Part 13) da Sai Geetha M N,

Molte applicazioni possono fornire un modo per catturare le preferenze degli utenti sui impostazioni di una specifica applicazione o un'attività. Per supportare lo , Android fornisce un semplice set di API.

Le preferenze sono in genere coppie di valori nominali. Possono essere memorizzati come "Preferenze condivise" attraverso varie attività in un'applicazione (nota attualmente non può essere condivisa tra i processi). Oppure può essere qualcosa che deve essere memorizzato specifico per un'attività.

  1. Preferenze condivise: Le preferenze condivisi possono essere utilizzati da tutti i componenti (attività, servizi, ecc) delle applicazioni.

  2. Preferenze di gestione attività: queste preferenze possono essere utilizzate solo all'interno di una determinata attività e non possono essere utilizzate da altri componenti dell'applicazione.

Preferenze condivise:

Le preferenze condivise sono gestite con l'aiuto di getSharedPreferences metodo della classe Context. Le preferenze sono memorizzate in un file predefinito (1) oppure è possibile specificare un nome file (2) da utilizzare per fare riferimento alle preferenze.

(1) Il metodo consigliato è quello di utilizzare la modalità di default, senza specificare il nome del file

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 

(2) Ecco come si ottiene l'istanza quando si specifica il nome del file

public static final String PREF_FILE_NAME = "PrefFile"; 
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE); 

MODE_PRIVATE è la modalità operativa per le preferenze. È la modalità predefinita e significa che il file creato sarà accessibile solo dall'applicazione chiamante. Altre due modalità supportate sono MODE_WORLD_READABLE e MODE_WORLD_WRITEABLE. Nell'applicazione MODE_WORLD_READABLE un'altra applicazione può leggere il file creato ma non può modificarlo. Nel caso di MODE_WORLD_WRITEABLE, anche altre applicazioni dispongono di autorizzazioni di scrittura per il file creato.

Infine, una volta che hai l'istanza preferenze, ecco come si può recuperare i valori memorizzati dalle preferenze:

int storedPreference = preferences.getInt("storedInt", 0); 

Per memorizzare i valori nel file di preferenze SharedPreference.Editor oggetto deve essere usato . Editor è un'interfaccia nidificata nella classe SharedPreference.

SharedPreferences.Editor editor = preferences.edit(); 
editor.putInt("storedInt", storedPreference); // value to store 
editor.commit(); 

Editor supporta anche metodi come remove() e clear() per eliminare i valori di preferenza dal file.

Preferenze

attività:

Le preferenze condivise possono essere utilizzati da altri componenti dell'applicazione. Ma se non hai bisogno di condividere le preferenze con altri componenti e vuoi avere preferenze private di attività, puoi farlo con l'aiuto del metodo getPreferences() dell'attività. Il metodo getPreference utilizza il metodo getSharedPreferences() con il nome della classe di attività per il nome file di preferenza.

seguito è il codice per ottenere preferenze

SharedPreferences preferences = getPreferences(MODE_PRIVATE); 
int storedPreference = preferences.getInt("storedInt", 0); 

Il codice per memorizzare valori è anche lo stesso come nel caso delle preferenze condivise.

SharedPreferences preferences = getPreference(MODE_PRIVATE); 
SharedPreferences.Editor editor = preferences.edit(); 
editor.putInt("storedInt", storedPreference); // value to store 
editor.commit(); 

È inoltre possibile utilizzare altri metodi come la memorizzazione dello stato di attività nel database. Nota Android contiene anche un pacchetto chiamato android.preference. Il pacchetto definisce le classi per implementare l'interfaccia utente delle preferenze dell'applicazione.

Per vedere altri esempi, controllare il post di Android Data Storage sul sito degli sviluppatori.

+51

+1: u salvato il mio giorno .. nessuno dei tutorial/esempi su Internet parla di questo. parlano solo di funzionalità e personalizzazioni, ma non di come leggerlo. – ankitjaininfo

+0

btw, qual è il nome del file in questo caso? – ankitjaininfo

+1

Vedere il mio aggiornamento della risposta, e il nome del file è qualcosa come 'pacchetto.prefs', ma non sono sicuro. – Pentium10

29

Se non si dispone di accesso a getDefaultSharedPreferenes(), è possibile utilizzare getSharedPreferences(name, mode) invece, è sufficiente passare il nome corretto.

Android crea questo nome (probabilmente in base al nome del pacchetto del progetto?). Puoi ottenerlo inserendo il codice seguente in SettingsActivityonCreate() e vedendo cosa è preferencesName.

String preferencesName = this.getPreferenceManager().getSharedPreferencesName(); 

La stringa dovrebbe essere qualcosa di simile com.example.projectname_preferences. Inserisci il codice hard da qualche parte nel tuo progetto e passalo a getSharedPreferences() e dovresti essere pronto.

+0

L'origine per attività legge: public SharedPreferences getPreferences (modalità int) { return getSharedPreferences (getLocalClassName(), mode); } – Tatarize

18

Dichiarare questi metodi primi ..

public static void putPref(String key, String value, Context context) { 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
    SharedPreferences.Editor editor = prefs.edit(); 
    editor.putString(key, value); 
    editor.commit(); 
} 

public static String getPref(String key, Context context) { 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
    return preferences.getString(key, null); 
} 

quindi chiamare questo quando si vuole mettere un pref:

putPref("myKey", "mystring", getApplicationContext()); 

chiamata quando si desidera ottenere una pref:

getPref("myKey", getApplicationContext()); 

oppure è possibile utilizzare questo oggetto https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo che semplifica tutto ancora più

Esempio:

TinyDB tinydb = new TinyDB(context); 

tinydb.putInt("clickCount", 2); 
tinydb.putFloat("xPoint", 3.6f); 
tinydb.putLong("userCount", 39832L); 

tinydb.putString("userName", "john"); 
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray); 
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap); 
+0

Perché non utilizzare editor.apply(); invece di impegnarsi per l'elaborazione in background –

2

dover passare contesto in giro ovunque è davvero fastidioso me. il codice diventa troppo prolisso e ingestibile. Lo faccio in ogni progetto, invece ...

public class global { 
    public static Activity globalContext = null; 

e impostarlo nell'attività principale creo

@Override 
public void onCreate(Bundle savedInstanceState) { 
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
      global.sdcardPath, 
      "")); 
    super.onCreate(savedInstanceState); 

    //Start 
    //Debug.startMethodTracing("appname.Trace1"); 

    global.globalContext = this; 

anche tutte le chiavi di preferenza dovrebbe essere indipendente dal linguaggio, sono scioccato nessuno ha detto che.

getText(R.string.yourPrefKeyName).toString() 

ora chiamarla in modo molto semplice come questo in una sola riga di codice

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true); 
+3

Qual è il vantaggio di rendere le lingue indipendenti dalla lingua? Non vengono mai mostrati all'utente, giusto? – Gerd

+1

Per favore, per amore di dio, non usare mai un'attività come contesto globale. Se si deve utilizzare un contesto globale, si prega di farlo utilizzando una classe di applicazione personalizzata. – Thorben

+1

@Thorben Concordato. O semplicemente 'getApplicationContext()' –

2

se si dispone di una casella di controllo e si desidera recuperare il suo valore ovvero vero/falso in qualsiasi java file--

Use--

Context mContext; 
boolean checkFlag; 

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);` 
Problemi correlati