Preferencias de Android: cómo cargar los valores predeterminados cuando el usuario no ha usado la pantalla de preferencias?

Estoy usando una actividad de preferencia para permitir que el usuario establezca algunos valores. Lo 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 aún no están configuradas manualmente, quiero los valores predeterminados:

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

Sin embargo, cuando android:defaultValue="true" todavía obtengo el 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?

esta pregunta es similar a la mía:

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

Simplemente use este código en el método de 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.

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

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 indica que el false significa que los valores predeterminados no se sobrescribirán. 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 tanto, si tiene más de un archivo de preferencias, debe codificar ” true en todos 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.

Por ejemplo, ampliando DialogPreference , hago esto:

 @Override protected void onSetInitialValue(boolean restre, Object defaultValue) { super.onSetInitialValue(restre, defaultValue); if (restre) { mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault; } else { mValue = mDefault; } } 

mDefault puede ser:

  • mContext.getResources (). getString (attrs.getAttributeResourceValue (androidns, “defaultValue”, 100));
  • algo que has indexado en R.

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ó.