Preferencias de Android: ¿Cómo cargar los valores predeterminados cuando el usuario no ha utilizado la pantalla de preferencias?

Estoy usando una PreferenceActivity para permitir que el usuario establezca algunos valores. Estoy alimentando el archivo xml con las preferencias definidas.

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

Cuando inicio mi aplicación, necesito las preferencias, o si no están configuradas manualmente, quiero los valores por defecto:

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

Sin embargo, cuando android:defaultValue="true" todavía me sale false . Por lo tanto, parece que los valores defaultValues ​​establecidos en el XML no se utilizan en ningún lugar, sino al inicializar la pantalla de preferencias.

No quiero codificar los valores por defecto en el método getBoolean() . Por lo tanto, hay una manera de obtener los valores por defecto con sólo definir estos en 1 lugar?

Esta pregunta es similar a la mía:

Inicializar-preferencias-de-xml-en-actividad principal

Sólo use este código en el método onCreate :

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

readAgain sus preferencias desde XML y el último parámetro ( readAgain ) garantizará que las preferencias del usuario no se sobrescribirán.

Echa un vistazo a PreferenceManager.setDefaultValues en la API de Android para una investigación más detallada.

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

Para recuperar las preferencias que tiene que usar
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
Para 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.

En la respuesta aceptada de Pixel:

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

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

Si usted está preocupado por 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, solo establece SPL en un número alto.

Por ejemplo extendiendo 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 ha indexado en R.

También asegúrese de que nunca ha utilizado SharedPreferences antes. Para asegurarse de que no se hayan cambiado (lo que significa que setDefaultValues ​​(esto, xml, false) no tiene ningún efecto) desinstale su aplicación y vuelva a cargarla para asegurarse de que no se toquen valores. Esto me ayudó.

  • Las preferencias compartidas sólo se guardan por primera vez
  • Preferencias de Android: Valores predeterminados incorrectos DESPITE "setDefaultValues"
  • PreferenceScreen personalizado con botones pulsables
  • Lea SharedPreferences cuando no haya definido el nombre del archivo
  • Agregar botones a PreferenceFragment
  • ¿Cómo editar / restablecer Alarm Manager?
  • No se puede establecer la preferencia con PreferenceActivity
  • Preferencias con ActionBar Sherlock
  • Utilizar una subclase personalizada de SharedPreferences con PreferenceActivity o PreferenceFragment
  • Cómo establecer el resumen de preferencias edittext y hacer que se pegue
  • ¿Cuál es el nombre de archivo utilizado por defecto las preferencias compartidas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.