studio programacion herramientas fundamentos con avanzado aplicaciones java android

java - programacion - manual de android en pdf



Preferencias de la lista de Android: ¿tiene un resumen como valor seleccionado? (10)

Aquí hay una versión ampliada de la respuesta de midhunhk que aborda la útil cadena "android: summary" también

// 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 que quede claro, Android: resumen se elimina del xml relacionado.

Tengo una actividad de Preferencia que usa una Preferencia de Lista como la define mi archivo XML. ¿Cómo establecería el resumen de la actividad de la lista en el valor que se selecciona?

¡Gracias!


Este es el código que estoy usando, no llama a setValue manualmente, ya que creo que esto ya está hecho 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 , simplemente compruebo la clave de lo que se está cambiando y luego, para las Preferencias de lista, la vuelvo a convertir en Lectura humana (entrada en lugar de entryValue) con las declaraciones 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>


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

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

Luego, cuando cargue la Actividad por primera vez y cada vez que cambie el valor de las preferencias, use el método que desee para obtener el valor de ListPreference y configure el resumen con:

pref.setSummary(theNewString);


Puede usar 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, utilicé 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://.com/a/8155029/592025 es que muestra el valor de mi preferencia (como 1, 2 3, etc.). Quiero mostrar la entrada (cuerda 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 se cambia el valor, establecer el valor explícitamente y volver a leer la entrada.


Tiene un método bindPreferenceSummaryToValue en su PreferenceActivity,

puede agregar fácilmente el resumen a la lista haciendo esto:

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

En su método OnCreate llama a la función bind así:

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

Puede agregar fácilmente otros 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)));


Y esta es una forma de lidiar con la actualización de resumen de la preferencia de tonos 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; } })


en onCreatePreferences haz esto ::

SharedPreferences sharedPreferences =getPreferenceScreen().getSharedPreferences(); PreferenceScreen prefScreen = getPreferenceScreen(); int count = prefScreen.getPreferenceCount(); for (int i = 0; i < count; i++) { Preference p = prefScreen.getPreference(i); if (p instanceof ListPreference) { String value = sharedPreferences.getString(p.getKey(), ""); ListPreference listPreference = (ListPreference) preference; int prefIndex = listPreference.findIndexOfValue(stringValue); if (prefIndex >= 0) { preference.setSummary(listPreference.getEntries()[prefIndex]); } } }


La forma más sencilla de hacerlo es simplemente para que Android lo haga por usted. Suponiendo que desea que el resumen coincida con el valor seleccionado, simplemente puede establecer el resumen de ListPreference en "%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á %s con el valor de cadena actual de la preferencia, tal como se muestra en el selector de ListPreference . El resumen de la lista también se configurará correctamente cuando ingrese la actividad; no es necesario que escriba ningún código especial para configurarlo inicialmente.

Pasé demasiado tiempo SharedPreferences con oyentes de SharedPreferences antes de descubrir esto.