2010-04-22 12 views
99

Sto utilizzando un PreferenceActivity per consentire all'utente di impostare alcuni valori. Sto alimentando il file xml con le preferenze definite.Preferenze Android: come caricare i valori predefiniti quando l'utente non ha utilizzato la schermata delle preferenze?

Ho impostato tutti gli android:defaultValue="" per loro.

Quando comincio la mia domanda, ho bisogno le preferenze, o se essi non sono impostati ancora manualmente, voglio i valori di default:

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

Tuttavia, quando android:defaultValue="true" ho ancora false. Quindi, sembra che i valori predefiniti impostati nell'XML non vengano utilizzati da nessuna parte ma quando si inizializza lo schermo delle preferenze.

Non voglio codificare i valori predefiniti nel metodo getBoolean(). Quindi, c'è un modo per ottenere i valori di default con la sola definizione di questi in 1 posto?

risposta

151

questa domanda è simile al mio:

initialize-preferences-from-xml-in-main-activity

Basta utilizzare questo codice in onCreate metodo:

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

Si caricherà le tue preferenze da XML e l'ultimo parametro (readAgain) garantiranno che le preferenze dell'utente abbiano vinto essere sovrascritto

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

+0

Possiamo usarlo su qualsiasi altra varibile SharedPrefrence che creiamo? –

+0

@pixel Questo non funziona per le preferenze di stringa. – Anderson

+8

Inoltre, se la tua app ha più punti di ingresso, posizionala in 'onCreate()' di 'Applicazione'. –

2

Ad esempio estendentesi DialogPreference faccio questo:

@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.
+0

Ok, sono un po 'perso qui per quello che stai cercando di raggiungere. Non voglio chiamare DialogPreference, ho bisogno del valore predefinito quando l'utente non usa le Preferenze. – Peterdk

+0

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

24

essere consapevoli che se si sta utilizzando
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

per richiamare le preferenze è necessario utilizzare
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
per impostare valori di default!

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

Spero che questo possa aiutare qualcuno.

9

in risposta accettato di Pixel:

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

si precisa che il false significa che di default non verranno sovrascritti. Questo non è quello che fa, è solo un indicatore di efficienza per interrompere l'analisi se l'applicazione ha più di un punto di ingresso.Sfortunatamente il test non viene eseguito per file di preferenza, quindi se si dispone di più di un file di preferenza è necessario codificare true su tutti tranne il primo.

Se si è preoccupati dell'efficienza, è possibile codificare qualcosa come questo.

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 si aggiungono più preferenze condivise, impostare SPL su un numero elevato.

+2

In alternativa, puoi sempre creare un bulk preferences.xml che utilizzi SOLO per impostare valori predefiniti. Ad esempio, se hai 'R.xml.prefs_device', ' R.xml.prefs_test' e 'R.xml.prefs_admin'. È possibile creare un file di prefs che contenga tutti i prefs di cui sopra: 'R.xml.prefs_for_loading_default_values'. Quindi utilizzare quello con 'PreferenceManager.setDefaultValues ​​(questo, R.xml.prefs_for_loading_default_values, false);' –

0

Assicurarsi inoltre di non aver mai utilizzato SharedPreferences in precedenza. Per assicurarti che non vengano modificati (il che significa che setDefaultValues ​​(this, xml, false) non ha alcun effetto) disinstallare l'app e caricarla di nuovo per assicurarsi che nessun valore venga toccato. Questo mi ha aiutato.

Problemi correlati