El texto de resumen de ListPreference no se actualiza automáticamente siempre que hay un cambio en la selección

Aunque está siendo documentado, usando "%s" , puedo mostrar el valor seleccionado como resumen, no funciona como se esperaba.

Http://developer.android.com/reference/android/preference/ListPreference.html#getSummary%28%29

Tengo las siguientes preferences.xml

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/preference_xxx_category"> <CheckBoxPreference android:title="@string/preference_xxx_mode_title" android:defaultValue="false" android:summary="@string/preference_xxx_mode_summary" android:key="xxxModePreference" /> </PreferenceCategory> <PreferenceCategory android:title="@string/preference_yyy_category"> <ListPreference android:title="@string/preference_yyy_mode_title" android:defaultValue="0" android:entries="@array/yyy" android:entryValues="@array/yyy_values" android:summary="%s" android:key="yyyModePreference" /> </PreferenceCategory> </PreferenceScreen> 

Y aquí está mi arrays.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="yyy"> <item>Display value 0</item> <item>Display value 1</item> </string-array> <string-array name="yyy_values"> <item>0</item> <item>1</item> </string-array> </resources> 

Lo que esperaba al tener el siguiente código Java para crear una actividad de preferencia completa, con una casilla de verificación y una preferencia de lista, el texto de resumen de la preferencia de lista se puede actualizar automáticamente, siempre que realice la selección. El texto de resumen cambiará entre Valor de visualización 0 y Valor de visualización 1 .

 public class Preferences extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } } 

Sin embargo, me doy cuenta de que el texto de resumen para la preferencia de lista no se actualizará automáticamente. Sólo cuando realice marcar o desmarcar en casilla de verificación, solo la actividad completa será invalidada y el texto de resumen para la preferencia de lista SE actualizará SOLAMENTE.

Por lo tanto, tengo que revisar mi código como sigue, que parece más engorroso .

 public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this); } @Override public void onResume() { super.onResume(); // Cumbersome way to make sure list preference's summary text is being updated. final String key = "yyyModePreference"; ListPreference listPreference = (ListPreference)findPreference(key); final String value = PreferenceManager.getDefaultSharedPreferences(this).getString(key, key); final int index = listPreference.findIndexOfValue(value); if (index >= 0) { final String summary = (String)listPreference.getEntries()[index]; listPreference.setSummary(summary); } } @Override public void onSharedPreferenceChanged(SharedPreferences options, String key) { // Cumbersome way to make sure list preference's summary text is being updated. if (key.equals("yyyModePreference")) { ListPreference listPreference = (ListPreference)findPreference(key); final String value = options.getString(key, key); final int index = listPreference.findIndexOfValue(value); if (index >= 0) { final String summary = (String)listPreference.getEntries()[index]; listPreference.setSummary(summary); } } } } 

¿Es esto una manera correcta? ¿Hay alguna manera simplificada, para asegurar que el texto de resumen de ListPreference siempre se actualiza automáticamente siempre que hay un cambio en la selección.

Este es un error que existía en las plataformas anteriores a KITKAT (es decir, android-4.4_r0.7), y se fija por commit 94c02a1

La solución de @ilomambo funciona, pero puede que no sea la mejor. He leído la fuente de ListPreference y ListPreference encontrado esta solución:

Archivo: ListPreferenceCompat.java

 package com.example.yourapplication; import android.content.Context; import android.os.Build; import android.preference.ListPreference; import android.text.TextUtils; import android.util.AttributeSet; public class ListPreferenceCompat extends ListPreference { @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ListPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ListPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public ListPreferenceCompat(Context context, AttributeSet attrs) { super(context, attrs); } public ListPreferenceCompat(Context context) { super(context); } // NOTE: // The framework forgot to call notifyChanged() in setValue() on previous versions of android. // This bug has been fixed in android-4.4_r0.7. // Commit: platform/frameworks/base/+/94c02a1a1a6d7e6900e5a459e9cc699b9510e5a2 // Time: Tue Jul 23 14:43:37 2013 -0700 // // However on previous versions, we have to workaround it by ourselves. @Override public void setValue(String value) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { super.setValue(value); } else { String oldValue = getValue(); super.setValue(value); if (!TextUtils.equals(value, oldValue)) { notifyChanged(); } } } } 

Cuando necesite utilizar ListPreference en xml, simplemente reemplace la etiqueta por com.example.yourapplication.ListPreferenceCompat .

Esto funciona perfectamente en mi dispositivo Samsung S4 con Android 4.3, y dentro de una de mis aplicaciones de producción.

Supongo que es algún tipo de error extraño, porque lo he probado en el emulador con Android 2.3.3 y no funcionó, pero cuando lo probé en 4.0.3 funcionó. Lo que hice fue android:summary="%s" en xml para ListPreference y eso es todo.

IMHO es un error. El onClickListener () definido en ListPreference.java # builder.setSingleChoiceItems () no llama a notifyChanged()

Sucede que la codificación de mi propia ListPreference basado en ese código, y corrió a través del mismo problema que el OP, agregué notifyChanged() :

  ... dialog.dismiss(); notifyChanged(); // <<<<<<<<<< } }); 

Y ahora el resumen de preferencias se actualiza tan pronto como lo elija. No es dependiente de la versión de Android, ListPreference se ha codificado como este desde siempre.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.