2010-04-22 12 views
99

Estoy usando una actividad de preferencia para permitir que el usuario establezca algunos valores. Le estoy dando el archivo xml con las preferencias definidas.Preferencias de Android: cómo cargar los valores predeterminados cuando el usuario no ha usado la pantalla de preferencias?

He establecido todos los android:defaultValue="" para ellos.

Cuando comienzo mi solicitud, necesito las preferencias, o si no se han establecido todavía de forma manual, quiero que los valores por defecto:

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

Sin embargo, cuando android:defaultValue="true" sigo teniendo false. Por lo tanto, parece que los valores predeterminados establecidos en el XML no se usan en ningún otro lado, sino al inicializar la pantalla de preferencias.

No quiero codificar los valores predeterminados en el método getBoolean(). Entonces, ¿hay alguna manera de obtener los valores por defecto con solo definir estos en 1 lugar?

Respuesta

151

esta pregunta es similar a la mía:

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

sólo tiene que utilizar este código en onCreate método:

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

Cargará sus preferencias de XML, y el último parámetro (readAgain) garantizarán que las preferencias del usuario ganaron no se sobrescriba

Eche un vistazo a PreferenceManager.setDefaultValues en la API de Android para una mayor investigación.

+0

¿Podemos usar esto sobre cualquier otra variedad SharedPrefrence que creamos? –

+0

@pixel Esto no funciona para las preferencias de cadena. – Anderson

+8

Además, si su aplicación tiene múltiples puntos de entrada, colóquela en 'onCreate()' de 'Application'. –

2

Por ejemplo extiende DialogPreference hago esto:

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

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

mDefault puede ser:.

  • mContext.getResources() GetString (attrs.getAttributeResourceValue (androidns, "defaultValue", 100)) ;
  • algo que haya indexado en R.
+0

Ok, estoy un poco perdido aquí acerca de lo que estás tratando de lograr. No quiero llamar a DialogPreference. Necesito el valor predeterminado cuando el usuario no usa las Preferencias. – Peterdk

+0

En lugar de usar Preferencias por defecto en su prefs.xml puede crear sus propias clases. Por ejemplo, puede crear una nueva DialogPreference que se extiende desde DialogPreference y anular el onSetInitialValue. – Macarse

24

Tenga en cuenta que si está utilizando
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

para recuperar las preferencias que usted tiene que utilizar
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
a establecer los valores predeterminados!

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

Espero que esto pueda ayudar a alguien.

9

en respuesta aceptada de Pixel:

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

se afirma que el false significa que por defecto no se pueden sobrescribir. Esto no es lo que hace, es solo un indicador de eficiencia para detener el análisis si su aplicación tiene más de un punto de entrada.Lamentablemente, la prueba no se realiza por archivo de preferencia, por lo que si tiene más de un archivo de preferencias, debe codificar true en todos los casos excepto en el primero.

Si le preocupa la eficiencia, podría codificar algo como esto.

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

Si alguna vez agrega más preferencias compartidas, simplemente configure SPL a un número alto.

+2

Como alternativa, siempre puede crear un preferences.xml masivo que SÓLO use para establecer valores predeterminados. Por ejemplo, si tiene 'R.xml.prefs_device', ' R.xml.prefs_test', y 'R.xml.prefs_admin'. Puede crear un archivo de preferencias que contenga todas las preferencias de las anteriores: 'R.xml.prefs_for_loading_default_values'. Luego use eso con 'PreferenceManager.setDefaultValues ​​(this, R.xml.prefs_for_loading_default_values, false);' –

0

También asegúrese de nunca haber usado las Preferencias Compartidas antes. Para asegurarse de que no se modifiquen (lo que significa que setDefaultValues ​​(this, xml, false) no tiene ningún efecto) desinstale su aplicación y cárguela de nuevo para asegurarse de que no se toque ningún valor. Esto me ayudó.

Cuestiones relacionadas