Come ottengo le preferenze condivise da una Preferenza attiva in Android?


373

Sto usando PreferenceActivity per mostrare alcune impostazioni per la mia applicazione. Sto gonfiando le impostazioni tramite un file XML in modo che il mio onCreate (e i metodi di classe completi) si presentino così:

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

Il javadoc di PreferenceActivity PreferenceFragment afferma che

Queste preferenze verranno automaticamente salvate su SharedPreferences man mano che l'utente interagisce con esse. Per recuperare un'istanza di SharedPreferences che verrà utilizzata dalla gerarchia delle preferenze in questa attività, chiama 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)

nell'altra attività, ma ho bisogno del nome di SharedPreference che è stato utilizzato da PreferenceActivity. Qual è il nome o come posso recuperarlo?

Risposte:


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

Aggiornare

Secondo le preferenze condivise | Tutorial per sviluppatori Android (parte 13) di Sai Geetha MN,

Molte applicazioni possono fornire un modo per acquisire le preferenze dell'utente sulle impostazioni di un'applicazione specifica o di un'attività. A supporto di ciò, Android fornisce un semplice set di API.

Le preferenze sono in genere coppie valore-nome. Possono essere memorizzati come "Preferenze condivise" tra le varie attività in un'applicazione (notare che attualmente non può essere condiviso tra i processi). Oppure può essere qualcosa che deve essere memorizzato in modo specifico per un'attività.

  1. Preferenze condivise: le preferenze condivise possono essere utilizzate da tutti i componenti (attività, servizi ecc.) Delle applicazioni.

  2. Preferenze gestite dall'attività: queste preferenze possono essere utilizzate solo nell'ambito di un'attività specifica e non possono essere utilizzate da altri componenti dell'applicazione.

Preferenze condivise:

Le preferenze condivise sono gestite con l'aiuto del getSharedPreferencesmetodo della Contextclasse. 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 modo consigliato è di utilizzare la modalità predefinita, senza specificare il nome del file

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Ecco come ottenere 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_READABLEe MODE_WORLD_WRITEABLE. In MODE_WORLD_READABLEaltre applicazioni è possibile leggere il file creato ma non è possibile modificarlo. In caso diMODE_WORLD_WRITEABLE altre applicazioni hanno anche le autorizzazioni di scrittura per il file creato.

Infine, una volta che hai l'istanza delle preferenze, ecco come puoi recuperare i valori memorizzati dalle preferenze:

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

Per memorizzare i valoriSharedPreference.Editor nell'oggetto file delle preferenze deve essere utilizzato. Editorè un'interfaccia nidificata nella SharedPreferenceclasse.

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 delle preferenze dal file.

Preferenze attività:

Le preferenze condivise possono essere utilizzate da altri componenti dell'applicazione. Ma se non è necessario condividere le preferenze con altri componenti e si desidera avere preferenze private di attività, è possibile farlo con l'aiuto del getPreferences()metodo dell'attività. Il getPreferencemetodo utilizza il getSharedPreferences()metodo con il nome della classe di attività per il nome del file delle preferenze.

Di seguito è riportato il codice per ottenere le preferenze

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

Anche il codice per memorizzare i valori è lo stesso del 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 delle attività nel database. Nota Android contiene anche un pacchetto chiamatoandroid.preference . Il pacchetto definisce le classi per implementare l'interfaccia utente delle preferenze dell'applicazione.

Per vedere altri esempi, controlla il post di archiviazione dei dati di Android sul sito degli sviluppatori.


55
+1: mi hai salvato la giornata .. nessuno dei tutorial / esempi su Internet lo dice. tutti parlano di funzionalità e personalizzazioni, ma non di come leggerlo.
ankitjaininfo,

1
Vedi il mio aggiornamento della risposta e il nome del file è simile package.prefsma non ne sono sicuro.
Pentium10

1
Grazie per il codice C'è solo una piccola cosa che mi confonde: SharedPreference è un'interfaccia, quindi dov'è implementato il codice effettivo che gestisce le chiamate di metodo?
x1886x,

1
Vorrei averlo letto una settimana prima di perdere tempo leggendo alcune risposte / commenti stupidi nerd in tutto il SE, che pensano di sapere quando in realtà non lo fanno .. Grazie @ Pentium10, possiedi qualche blog, grazie ancora, lo apprezzo davvero :)
Sanjeevcn

1
Invece di usare editor.commit (), puoi anche usare editor.apply (). La differenza è che commit () scrive le modifiche in modo sincrono e si applica le scrive in modo asincrono. Questo rende la tua UI più veloce.
Hashim Akhtar,

29

Se non hai accesso a getDefaultSharedPreferenes(), puoi getSharedPreferences(name, mode)invece utilizzare , devi solo passare il nome giusto.

Android crea questo nome (possibilmente in base al nome del pacchetto del tuo progetto?). Puoi ottenerlo inserendo il seguente codice in a SettingsActivity onCreate()e vedendo che cos'è preferencesName.

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

La stringa dovrebbe essere qualcosa di simile com.example.projectname_preferences. Hard code che da qualche parte nel tuo progetto, e passalo a getSharedPreferences()e dovresti essere a posto.


1
La fonte per l'attività legge: publicPreferences pubbliche GetPreferences (modalità int) {return getSharedPreferences (getLocalClassName (), mode); }
Tatarize il

22

Dichiarare prima questi metodi ..

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 chiamalo quando vuoi mettere un pref:

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

chiamalo quando vuoi ottenere un pref:

getPref("myKey", getApplicationContext());

Oppure puoi usare questo oggetto https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo che semplifica ulteriormente tutto

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

Perché non usare editor.apply (); invece di impegnarsi per l'elaborazione in background
Avi Parshan,

4

dover passare il contesto ovunque mi sta davvero infastidendo. il codice diventa troppo dettagliato e ingestibile. Lo faccio in ogni progetto invece ...

public class global {
    public static Activity globalContext = null;

e impostarlo nella creazione dell'attività principale

@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 dovrebbero essere indipendenti dalla lingua, sono scioccato che nessuno l'abbia menzionato.

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

ora chiamalo semplicemente così in una riga di codice

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

4
Qual è il vantaggio di rendere indipendente la lingua delle chiavi? Non vengono mai mostrati all'utente, giusto?
Gerd,

1
Per favore, per amore di Dio, non usare mai un'attività come contesto globale. Se devi utilizzare un contesto globale, ti preghiamo di farlo utilizzando una classe di applicazione personalizzata.
Thorben,

1
@Thorben Concordato. O semplicementegetApplicationContext()
OneCricketeer,

3

se hai una casella di controllo e desideri recuperare il valore, ovvero true / false in qualsiasi file java,

Uso--

Context mContext;
boolean checkFlag;

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

0

Aggiornato 2019

Puoi semplicemente usare la PowerPreferencelibreria

https://github.com/AliEsaAssadi/Android-Power-Preference

Ottenere l'istanza di preferenza condivisa

Per ottenere l'istanza predefinita devi solo chiamare

PowerPreference.getDefaultFile()

O se vuoi un file di preferenze specifico

PowerPreference.getFileByName(fileName)

Scrittura dei dati:

PowerPreference.getDefaultFile().put(key,value)

Ottenere dati

PowerPreference.getDefaultFile().getString(key,value)

In che modo PowerPreference gestisce la parte di contesto? È necessario un contesto per leggere le preferenze condivise, no? Sono nuovo su Android e sto cercando di capire.
Yeti,

0

Prova a seguire il codice sorgente ha funzionato per me

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.