Preferencias de listas de Android: ¿tiene un resumen como valor seleccionado?

Tengo una actividad de la preferencia que utiliza preferencias de la lista según lo definido por mi archivo de XML. ¿Cómo establecería el resumen de la actividad de la lista con el valor seleccionado?

¡Gracias!

La forma más sencilla de hacerlo es que Android lo haga por usted. Suponiendo que desea que el resumen coincida con el valor seleccionado, simplemente puede configurar el resumen de la ListPreference a "%s" utilizando XML o el método setSummary en Java. Por ejemplo:

 <ListPreference android:key="pref_list" android:title="A list of preferences" android:summary="%s" android:entries="@array/pref_list_entries" android:entryValues="@array/pref_list_entries_values" android:defaultValue="0" /> 

Android reemplazará a %s por el valor de cadena actual de la preferencia, tal como se muestra en el selector de ListPreference .

Pasé mucho tiempo SharedPreferences con los oyentes de SharedPreferences antes de descubrir esto. Como bono, el resumen de la lista se establecerá correctamente al entrar en la actividad.

Puede utilizar OnPreferenceChangeListener para cambiar dinámicamente el resumen. El problema es que obtiene el valor seleccionado (de android:entryValues ), no el título ( android:entries ). En el siguiente código usé toString() , pero la solución adecuada es encontrar el título para el valor. De todos modos, la idea funciona:

 public class Preferences extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.your_prefs); ListPreference listPreference = (ListPreference) findPreference("preference_key"); if(listPreference.getValue()==null) { // to ensure we don't get a null value // set first value by default listPreference.setValueIndex(0); } listPreference.setSummary(listPreference.getValue().toString()); listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { preference.setSummary(newValue.toString()); return true; } }); } } 

También quería lograr algo similar, pero el problema con https://stackoverflow.com/a/8155029/592025 es que, muestra el valor de mi preferencia (como 1, 2 3 etc). Quiero mostrar la entrada (secuencia legible por humanos) correspondiente al valor seleccionado.

Así que lo cambié de esta manera y funciona de la manera que lo necesito.

 listPreference.setSummary(servicePreference.getEntry().toString()); listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { // Set the value as the new value listPreference.setValue(newValue.toString()); // Get the entry which corresponds to the current value and set as summary preference.setSummary(listPreference.getEntry()); return false; } }); 

El truco es usar getEntry() lugar de getValue() y una vez que el valor se cambia, para establecer el valor explícitamente y leer la entrada.

Primero obtenga una referencia a ListPreference en su onCreate. Puede utilizar findPreference (). Por ejemplo:

 ListPreference pref = (ListPreference) findPreference("thePreferencesKey"); 

A continuación, cuando cargue la actividad por primera vez y cada vez que cambie el valor de las preferencias, utilice el método que desee para obtener el valor de ListPreference y establezca el resumen con:

 pref.setSummary(theNewString); 

Este es el código que estoy usando, no llama a setValue manualmente, ya que creo que esto ya se hace en una etapa posterior.

Aquí hay un ejemplo:

 @Override public boolean onPreferenceChange(Preference preference, Object value) { String textValue = value.toString(); ListPreference listPreference = (ListPreference) preference; int index = listPreference.findIndexOfValue(textValue); CharSequence[] entries = listPreference.getEntries(); preference.setSummary( index >= 0 ? entries[index] : null); return true; } 

Esto es exactamente lo que hice y funciona muy bien. En el onSharedPreferenceChangeListener sólo comprobar la clave de lo que se está cambiando y luego para ListPreferences convertirlo de nuevo a la lectura humana (entrada en lugar de entryValue) con las instrucciones if. Bastante simple.

 public class MyPreferences extends PreferenceFragment implements OnSharedPreferenceChangeListener{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); context = getActivity(); if (context == null){ Log.e("error","context is null"); } prefs = PreferenceManager.getDefaultSharedPreferences(context); myFrequencyList = (Preference) findPreference("frequency_key"); prefs.registerOnSharedPreferenceChangeListener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if(key.equals("frequency_key")){ String freq = sharedPreferences.getString("frequency_key", "8k Hz"); if(freq.equals("8000")){ freq = "8k Hz"; } else if(freq.equals("16000")){ freq = "16k Hz"; } else if(freq.equals("22050")){ freq = "22.05k Hz"; } else if(freq.equals("44100")){ freq = "44.1k Hz"; } else if(freq.equals("48000")){ freq = "48k Hz"; } else{ freq = "8k Hz"; } myFrequencyList.setSummary(freq); } 

Diseño xml

  <ListPreference android:id="@+id/frequency_list" android:key="frequency_key" android:summary="8000" android:title="Sample Rate" android:defaultValue="8000" android:dialogTitle="Larger sample rates create better sound quality but larger file sizes." android:entries="@array/freq_titles" android:entryValues="@array/freq_values" /> 

Matriz xml

 <?xml version="1.0" encoding="utf-8"?> 

 <string-array name="freq_titles"> <item>48k Hz</item> <item>44.1k Hz</item> <item>22.05k Hz</item> <item>16k Hz</item> <item>8k Hz</item> </string-array> <string-array name="freq_values"> <item>48000</item> <item>44100</item> <item>22050</item> <item>16000</item> <item>8000</item> </string-array> 

He aquí una versión ampliada de la respuesta de midhunhk que aborda la útil cadena "android: summary" así como

  // Retrieve & populate flash modes List<String> flashmodes = params.getSupportedFlashModes(); if (flashmodes != null) { final ListPreference lp = (ListPreference) findPreference("flash_list"); final String lp_basesummary = "Set the Flash mode. The default is 'auto'"; lp.setEntries(flashmodes.toArray(new CharSequence[flashmodes.size()])); lp.setEntryValues(flashmodes.toArray(new CharSequence[flashmodes.size()])); // If there's only one option, make it the default if (flashmodes.size() == 1) lp.setValueIndex(0); lp.setSummary(lp_basesummary + " [" + lp.getEntry() + "]"); lp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { // Set the value as the new value lp.setValue(newValue.toString()); // Get the entry which corresponds to the current value // and set as summary preference.setSummary(lp_basesummary + " [" + lp.getEntry() + "]"); return false; } }); } else { // Remove the preference ((PreferenceGroup) findPreference("camera_preference")).removePreference(findPreference("flash_list")); } // Retrieve & populate focus modes List<String> focusmodes = params.getSupportedFocusModes(); if (focusmodes != null) { final ListPreference lp = (ListPreference) findPreference("focus_mode_list"); final String lp_basesummary = "Set the Focus mode. The default is 'auto'"; ... 

Y, para estar claro, android: resumen se elimina del xml relacionado.

Y aquí hay una manera de lidiar con la actualización de resumen de la preferencia de tono después de una selección de usuario.

  final SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); final RingtonePreference rp_shuttle = (RingtonePreference) findPreference("shuttle_tone"); rp_shuttle.setSummary(RingtoneManager .getRingtone(getApplicationContext(), Uri.parse(preference.getString("shuttle_tone", "DEFAULT_SOUND"))) .getTitle(this)); rp_shuttle.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference mypreference, Object newValue) { rp_shuttle.setSummary(RingtoneManager.getRingtone(getApplicationContext(), Uri.parse(newValue + "")) .getTitle(getApplicationContext())); return true; } }) 

Usted hava un método bindPreferenceSummaryToValue en su PreferenciaActividad,

Usted puede agregar fácilmente el resumen a la lista que hace como esto:

 private static void bindPreferenceSummaryToValue(Preference preference) { preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager .getDefaultSharedPreferences(preference.getContext()) .getString(preference.getKey(), "")); } 

En yout OnCreate método que llamar a la función de enlace como este:

 bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_OF_THE_LIST))); 

Puedes añadir fácilmente otro resumen de la misma manera:

 bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_1))); bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_2))); bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_3))); 
  • Firebase: ¿una forma limpia de usar campos enum en Kotlin / Java?
  • Código antes del problema setContentView
  • No se puede conectar al servicio de cámara
  • Android: Descargar Object
  • Cambiar el tamaño de la fuente en la piel
  • Samsung Galaxy 7 "(GT-P6210) no detecta la depuración USB?
  • Android Eliminar el fondo de SeekBar
  • Aplicación para Android que muestra diferentes diseños a la vez con hdmi
  • Mes en la clase SimpleDateFormat
  • Java.text.ParseException: Unparseable date: "" (en el desplazamiento 0)
  • Cómo mostrar o leer el archivo docx
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.