Preferenze Android: come caricare i valori predefiniti quando l'utente non ha utilizzato la schermata delle preferenze?


119

Sto usando PreferenceActivity per consentire all'utente di impostare alcuni valori. Gli sto alimentando il file xml con le preferenze definite.

Ho impostato tutto android:defaultValue=""per loro.

Quando avvio la mia applicazione, ho bisogno delle preferenze o, se non sono ancora impostate manualmente, voglio i valori predefiniti:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 

Tuttavia, quando android:defaultValue="true"ricevo ancora false. Quindi, sembra che i defaultValues ​​impostati nell'XML non vengano usati da nessuna parte tranne che durante l'inizializzazione della schermata delle preferenze.

Non voglio codificare i valori predefiniti nel getBoolean()metodo. Quindi, esiste un modo per ottenere i valori predefiniti definendoli solo in 1 posizione?

Risposte:


169

questa domanda è simile alla mia:

Initialize-preferenze-da-xml-in-main-attività

Usa questo codice nel onCreatemetodo:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

Caricherà le tue preferenze da XML e last parameter ( readAgain) garantirà che le preferenze dell'utente non verranno sovrascritte. Ciò significa che impostare l' readAgainargomento su falsesignifica che questo imposterà i valori predefiniti solo se questo metodo non è mai stato chiamato in passato, quindi non devi preoccuparti di sovrascrivere le impostazioni dell'utente ogni volta che viene creata la tua attività

Dai un'occhiata a PreferenceManager.setDefaultValues nell'API Android per ulteriori indagini.


Possiamo usarlo su qualsiasi altra variabile SharedPrefrence che creiamo?
Amol Gupta

8
Inoltre, se la vostra applicazione ha più punti di ingresso, metterlo in onCreate()su Application.
SD

2
Questo non funziona se si utilizza un valore booleano e l'impostazione predefinita è "false", poiché la voce predefinita non verrà creata in Android 2.x. Una chiamata a ".getBoolean (KEY, true)" restituirà sempre true. Per Android 4.x funziona.
Gunnar Bernstein

10
L'impostazione readAgainsu true non ha nulla a che fare con la sovrascrittura delle preferenze dell'utente. Da Javadoc: Nota: questo NON ripristinerà le preferenze ai valori predefiniti.
devconsole

1
Per coloro che hanno problemi con questa soluzione (non funziona o funziona parzialmente o non sempre) vedere la risposta di Steve Waring di seguito ( stackoverflow.com/a/25602205/4410376 ). Molto probabilmente hai diversi file di preferenze condivise, ovvero Android sta creando diversi file di preferenze condivise in base alla tua configurazione o al codice disordinato.
Hack06

27

Sii consapevole che se stai usando
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

per recuperare le preferenze devi usare per impostare i valori predefiniti!
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

Per esempio:
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

Spero che questo possa aiutare qualcuno.


13

nella risposta accettata di Pixel:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

si afferma che falsesignifica che i valori predefiniti non verranno sovrascritti. Non è quello che fa, è solo un flag di efficienza per interrompere l'analisi se la tua applicazione ha più di un punto di ingresso. Sfortunatamente il test non viene effettuato per file di preferenze, quindi se hai più di un file di preferenze devi codificaretrue su tutti tranne il primo.

Se sei preoccupato per l'efficienza, potresti codificare qualcosa del genere.

final static private int SPL = 1;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getInt("spl", 0) != SPL)
{
    PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
    PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
    sp.edit().putInt("spl", SPL).apply();
}

Se aggiungi più preferenze condivise, imposta SPL su un numero alto.


2
In alternativa, puoi sempre creare un file Preferences.xml in blocco che utilizzi SOLO per l'impostazione dei valori predefiniti. Ad esempio, se si dispone R.xml.prefs_device, R.xml.prefs_teste R.xml.prefs_admin. È possibile creare un file di preferenze che contiene tutte le preferenze da sopra: R.xml.prefs_for_loading_default_values. Quindi PreferenceManager.setDefaultValues(this, R.xml.prefs_for_loading_default_values, false);
usalo

Per quanto riguarda l'efficienza: se lo chiami in onCreate()una sottoclasse di Application(registrato nel manifest) verrà comunque chiamato solo una volta per avvio dell'applicazione. Per le prestazioni sarebbe più rilevante (se non del tutto) non eseguire l'analisi ogni volta che l'app si avvia (invece solo al primo avvio) e questo è ciò che falsefa. Quindi è più una questione se è necessario un controllo ad ogni avvio (ad esempio quando potrebbero essere aggiunte nuove preferenze) o se è sufficiente se fatto al primo avvio (o reimpostare le preferenze).
user905686

2

Ad esempio, estendendo DialogPreferencelo faccio:

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    super.onSetInitialValue(restore, defaultValue);

    if (restore) {
        mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
    } else {
        mValue = mDefault;
    }
}

mDefault può essere:

  • mContext.getResources (). getString (attrs.getAttributeResourceValue (androidns, "defaultValue", 100));
  • qualcosa che hai indicizzato in R.

Ok, sono un po 'perso qui su ciò che stai cercando di ottenere. Non voglio chiamare DialogPreference, ho bisogno del valore predefinito quando l'utente non utilizza le Preferenze.
Peterdk

Invece di usare le preferenze predefinite nel tuo prefs.xml puoi creare le tue classi. Ad esempio è possibile creare un nuovo DialogPreference che si estende da DialogPreference e sovrascrivere onSetInitialValue.
Macarse

0

Assicurati anche di non aver mai usato le SharedPreferences prima. Per assicurarti che non vengano modificati (il che significa che setDefaultValues ​​(this, xml, false) non ha effetto) disinstalla la tua app e caricala di nuovo per assicurarti che non vengano toccati valori. Questo mi ha aiutato.

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.