¿Cómo se muestra el valor actual de una preferencia de Android en el resumen de preferencias?

Esto debe surgir muy a menudo.

Cuando el usuario está editando preferencias en una aplicación de Android, me gustaría que pudieran ver el valor actualmente establecido de la preferencia en el resumen de Preference .

Ejemplo: si tengo un ajuste de preferencia para "Descartar mensajes antiguos" que especifica el número de días después de los cuales se deben limpiar los mensajes. En PreferenceActivity me gustaría que el usuario vea:

"Descartar mensajes antiguos" <- title

"Limpiar mensajes después de x días" <- resumen donde x es el valor de preferencia actual

Crédito extra: haz esto reutilizable, así que puedo aplicarlo fácilmente a todas mis preferencias, independientemente de su tipo (para que funcione con EditTextPreference, ListPreference, etc. con una cantidad mínima de codificación).

28 Solutions collect form web for “¿Cómo se muestra el valor actual de una preferencia de Android en el resumen de preferencias?”

Hay maneras de hacer esto una solución más genérica, si eso se adapte a sus necesidades.

Por ejemplo, si desea que todas las preferencias de lista muestren su opción como resumen, podría tener esto para su implementación onSharedPreferenceChanged :

 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { Preference pref = findPreference(key); if (pref instanceof ListPreference) { ListPreference listPref = (ListPreference) pref; pref.setSummary(listPref.getEntry()); } } 

Esto es fácilmente extensible a otras clases de preferencia.

Y mediante el uso de la función getPreferenceCount y getPreference en PreferenceScreen y PreferenceCategory , podría escribir fácilmente una función genérica para recorrer el árbol de preferencias estableciendo los resúmenes de todas las preferencias de los tipos que desea a su toString representación

Aquí está mi solución … FWIW

 package com.example.PrefTest; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceGroup; import android.preference.PreferenceManager; public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); PreferenceManager.setDefaultValues(Preferences.this, R.xml.preferences, false); initSummary(getPreferenceScreen()); } @Override protected void onResume() { super.onResume(); // Set up a listener whenever a key changes getPreferenceScreen().getSharedPreferences() .registerOnSharedPreferenceChangeListener(this); } @Override protected void onPause() { super.onPause(); // Unregister the listener whenever a key changes getPreferenceScreen().getSharedPreferences() .unregisterOnSharedPreferenceChangeListener(this); } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { updatePrefSummary(findPreference(key)); } private void initSummary(Preference p) { if (p instanceof PreferenceGroup) { PreferenceGroup pGrp = (PreferenceGroup) p; for (int i = 0; i < pGrp.getPreferenceCount(); i++) { initSummary(pGrp.getPreference(i)); } } else { updatePrefSummary(p); } } private void updatePrefSummary(Preference p) { if (p instanceof ListPreference) { ListPreference listPref = (ListPreference) p; p.setSummary(listPref.getEntry()); } if (p instanceof EditTextPreference) { EditTextPreference editTextPref = (EditTextPreference) p; if (p.getTitle().toString().toLowerCase().contains("password")) { p.setSummary("******"); } else { p.setSummary(editTextPref.getText()); } } if (p instanceof MultiSelectListPreference) { EditTextPreference editTextPref = (EditTextPreference) p; p.setSummary(editTextPref.getText()); } } } 

Si utiliza PreferenceFragment , así es como lo solucioné. Se explica por sí mismo.

 public static class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onResume() { super.onResume(); for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); ++i) { Preference preference = getPreferenceScreen().getPreference(i); if (preference instanceof PreferenceGroup) { PreferenceGroup preferenceGroup = (PreferenceGroup) preference; for (int j = 0; j < preferenceGroup.getPreferenceCount(); ++j) { Preference singlePref = preferenceGroup.getPreference(j); updatePreference(singlePref, singlePref.getKey()); } } else { updatePreference(preference, preference.getKey()); } } } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { updatePreference(findPreference(key), key); } private void updatePreference(Preference preference, String key) { if (preference == null) return; if (preference instanceof ListPreference) { ListPreference listPreference = (ListPreference) preference; listPreference.setSummary(listPreference.getEntry()); return; } SharedPreferences sharedPrefs = getPreferenceManager().getSharedPreferences(); preference.setSummary(sharedPrefs.getString(key, "Default")); } } 

La documentación de Android dice que se puede usar un marcador de formato String en getSummary() :

Si el resumen tiene un marcador de formato String en él (es decir, "% s" o "% 1 $ s"), entonces el valor de entrada actual se sustituirá en su lugar.

Simplemente especificando android:summary="Clean up messages after %s days" en ListPreference xml declaración trabajado para mí.

Nota: Esto sólo funciona para ListPreference .

Mi opción es extender ListPreference y está limpio:

 public class ListPreferenceShowSummary extends ListPreference { private final static String TAG = ListPreferenceShowSummary.class.getName(); public ListPreferenceShowSummary(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ListPreferenceShowSummary(Context context) { super(context); init(); } private void init() { setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference arg0, Object arg1) { arg0.setSummary(getEntry()); return true; } }); } @Override public CharSequence getSummary() { return super.getEntry(); } } 

A continuación, agregue en su settings.xml:

 <yourpackage.ListPreferenceShowSummary android:key="key" android:title="title" android:entries="@array/entries" android:entryValues="@array/values" android:defaultValue="first value"/> 

Después de varias horas que he pasado para resolver este problema he implementado este código:

[UPDATE: el listado de la versión final]

 public class MyPreferencesActivity extends PreferenceActivity { ... ListPreference m_updateList; ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); m_updateList = (ListPreference) findPreference(getString(R.string.pref_update_interval_key)); String currentValue = m_updateList.getValue(); if (currentValue == null) { m_updateList.setValue((String)m_updateList.getEntryValues()[DEFAULT_UPDATE_TIME_INDEX]); currentValue = m_updateList.getValue(); } updateListSummary(currentValue); m_updateList.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { updateListSummary(newValue.toString()); return true; } }); } private void updateListSummary(String newValue) { int index = m_updateList.findIndexOfValue(newValue); CharSequence entry = m_updateList.getEntries()[index]; m_updateList.setSummary(entry); } } 

Esa fue la única solución que funcionó para mí bien. Antes de intentar subclases de ListPreferences e implementar android: summary = "bla bla bla% s". Ninguno de los dos trabajó.

Puede reemplazar las clases de preferencia predeterminadas e implementar la característica.

 public class MyListPreference extends ListPreference { public MyListPreference(Context context) { super(context); } public MyListPreference(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setValue(String value) { super.setValue(value); setSummary(getEntry()); } } 

Más adelante en usted xml usted puede utilizar la preferencia de encargo como

 <your.package.name.MyListPreference android:key="noteInterval" android:defaultValue="60" android:title="Notification Interval" android:entries="@array/noteInterval" android:entryValues="@array/noteIntervalValues" /> 

Este es el código que necesita para establecer el resumen en el valor elegido. También establece los valores en el inicio y respeta los valores predeterminados, no sólo en el cambio. Simplemente cambie "R.layout.prefs" a su archivo xml y extienda el método setSummary a sus necesidades. En realidad sólo se está manejando ListPreferences, pero es fácil de personalizar para respetar otras preferencias.

 package de.koem.timetunnel; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceGroup; public class Prefs extends PreferenceActivity implements OnSharedPreferenceChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.addPreferencesFromResource(R.layout.prefs); this.initSummaries(this.getPreferenceScreen()); this.getPreferenceScreen().getSharedPreferences() .registerOnSharedPreferenceChangeListener(this); } /** * Set the summaries of all preferences */ private void initSummaries(PreferenceGroup pg) { for (int i = 0; i < pg.getPreferenceCount(); ++i) { Preference p = pg.getPreference(i); if (p instanceof PreferenceGroup) this.initSummaries((PreferenceGroup) p); // recursion else this.setSummary(p); } } /** * Set the summaries of the given preference */ private void setSummary(Preference pref) { // react on type or key if (pref instanceof ListPreference) { ListPreference listPref = (ListPreference) pref; pref.setSummary(listPref.getEntry()); } } /** * used to change the summary of a preference */ public void onSharedPreferenceChanged(SharedPreferences sp, String key) { Preference pref = findPreference(key); this.setSummary(pref); } // private static final String LOGTAG = "Prefs"; } 

Koem

Tal vez como ListPreference: Modifique getSummary para obtener lo que desea:

 package your.package.preference; import android.content.Context; import android.util.AttributeSet; public class EditTextPreference extends android.preference.EditTextPreference{ public EditTextPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public EditTextPreference(Context context, AttributeSet attrs) { super(context, attrs); } public EditTextPreference(Context context) { super(context); } @Override public CharSequence getSummary() { String summary = super.getSummary().toString(); return String.format(summary, getText()); } } 

Y utilizar esto en su xml:

 <your.package.EditTextPreference android:key="pref_alpha" android:summary="Actual value: %s" android:title="Title" android:defaultValue="default" /> 

Así que usted es capaz de escribir un resumen con %s lugar del valor real.

En realidad, CheckBoxPreference tiene la capacidad de especificar un resumen diferente basado en el valor de casilla de verificación. Vea el android: summaryOff y android: summaryOn atributos (así como los métodos CheckBoxPreference correspondientes).

Para EditTextPreference:

 public class MyEditTextPreference extends EditTextPreference { public MyEditTextPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyEditTextPreference(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setText(String text) { super.setText(text); setSummary(text); } } 

Gracias por este consejo!

Tengo una pantalla de preferencia y quiero mostrar el valor de cada preferencia de lista como el resumen.

Esta es mi manera ahora:

 public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } @Override protected void onResume() { super.onResume(); // Set up initial values for all list preferences Map<String, ?> sharedPreferencesMap = getPreferenceScreen().getSharedPreferences().getAll(); Preference pref; ListPreference listPref; for (Map.Entry<String, ?> entry : sharedPreferencesMap.entrySet()) { pref = findPreference(entry.getKey()); if (pref instanceof ListPreference) { listPref = (ListPreference) pref; pref.setSummary(listPref.getEntry()); } } // Set up a listener whenever a key changes getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override protected void onPause() { super.onPause(); // Unregister the listener whenever a key changes getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { Preference pref = findPreference(key); if (pref instanceof ListPreference) { ListPreference listPref = (ListPreference) pref; pref.setSummary(listPref.getEntry()); } } 

Esto funciona para mí, pero me pregunto cuál es la mejor solución (rendimiento, estabilidad, escalabilidad): el Koem está mostrando o este?

Si alguien sigue buscando respuestas a esto, debe revisar treinta y tres respuestas de s.

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

Gracias, Reto, para la explicación detallada!

En caso de que esto sea de alguna ayuda a alguien, tuve que cambiar el código propuesto por Reto Meier para que funcione con el SDK para Android 1.5

 @Override protected void onResume() { super.onResume(); // Setup the initial values mListPreference.setSummary("Current value is " + mListPreference.getEntry().toString()); // Set up a listener whenever a key changes ... } 

El mismo cambio se aplica para la función de devolución de llamada onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)

Aclamaciones,

Chris

Resolví el problema con el siguiente descendiente de ListPreference:

 public class EnumPreference extends ListPreference { public EnumPreference(Context aContext, AttributeSet attrs) { super(aContext,attrs); } @Override protected View onCreateView(ViewGroup parent) { setSummary(getEntry()); return super.onCreateView(parent); } @Override protected boolean persistString(String aNewValue) { if (super.persistString(aNewValue)) { setSummary(getEntry()); notifyChanged(); return true; } else { return false; } } } 

Parece que funciona bien para mí en 1.6 hasta 4.0.4.

He visto todas las respuestas votadas muestran cómo establecer el resumen con el valor actual exacto, pero el OP quería también algo como:

"Limpiar mensajes después de x días" * <- resumen donde x es el valor de preferencia actual

Aquí está mi respuesta para lograr eso

Como dice la documentación sobre ListPreference.getSummary() :

Devuelve el resumen de esta ListPreference. Si el resumen tiene un marcador de formato de cadena en él (es decir, "% s" o "% 1 $ s"), entonces el valor de entrada actual se sustituirá en su lugar.

Sin embargo, he probado en varios dispositivos y no parece funcionar. Con algunas investigaciones, encontré una buena solución en esta respuesta . Simplemente consiste en extender cada Preference que utilice y sobreescribir getSummary() para que funcione según lo especificado en la documentación de Android.

Si sólo desea mostrar el valor de texto sin formato de cada campo como su resumen, el código siguiente debería ser el más fácil de mantener. Requiere sólo dos cambios (líneas 13 y 21, marcados con "cambiar aquí"):

 package com.my.package; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { private final String[] mAutoSummaryFields = { "pref_key1", "pref_key2", "pref_key3" }; // change here private final int mEntryCount = mAutoSummaryFields.length; private Preference[] mPreferenceEntries; @SuppressWarnings("deprecation") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences_file); // change here mPreferenceEntries = new Preference[mEntryCount]; for (int i = 0; i < mEntryCount; i++) { mPreferenceEntries[i] = getPreferenceScreen().findPreference(mAutoSummaryFields[i]); } } @SuppressWarnings("deprecation") @Override protected void onResume() { super.onResume(); for (int i = 0; i < mEntryCount; i++) { updateSummary(mAutoSummaryFields[i]); // initialization } getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); // register change listener } @SuppressWarnings("deprecation") @Override protected void onPause() { super.onPause(); getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); // unregister change listener } private void updateSummary(String key) { for (int i = 0; i < mEntryCount; i++) { if (key.equals(mAutoSummaryFields[i])) { if (mPreferenceEntries[i] instanceof EditTextPreference) { final EditTextPreference currentPreference = (EditTextPreference) mPreferenceEntries[i]; mPreferenceEntries[i].setSummary(currentPreference.getText()); } else if (mPreferenceEntries[i] instanceof ListPreference) { final ListPreference currentPreference = (ListPreference) mPreferenceEntries[i]; mPreferenceEntries[i].setSummary(currentPreference.getEntry()); } break; } } } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { updateSummary(key); } } 
 public class ProfileManagement extends PreferenceActivity implements OnPreferenceChangeListener { EditTextPreference screenName; ListPreference sex; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.layout.profile_management); screenName = (EditTextPreference) findPreference("editTextPref"); sex = (ListPreference) findPreference("sexSelector"); screenName.setOnPreferenceChangeListener(this); sex.setOnPreferenceChangeListener(this); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { preference.setSummary(newValue.toString()); return true; } } 

Aquí está mi solución:

Construir un método de tipo de preferencia 'getter'.

 protected String getPreference(Preference x) { // http://stackoverflow.com/questions/3993982/how-to-check-type-of-variable-in-java if (x instanceof CheckBoxPreference) return "CheckBoxPreference"; else if (x instanceof EditTextPreference) return "EditTextPreference"; else if (x instanceof ListPreference) return "ListPreference"; else if (x instanceof MultiSelectListPreference) return "MultiSelectListPreference"; else if (x instanceof RingtonePreference) return "RingtonePreference"; else if (x instanceof SwitchPreference) return "SwitchPreference"; else if (x instanceof TwoStatePreference) return "TwoStatePreference"; else if (x instanceof DialogPreference) // Needs to be after ListPreference return "DialogPreference"; else return "undefined"; } 

Cree un método 'setSummaryInit'.

 public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { Log.i(TAG, "+ onSharedPreferenceChanged(prefs:" + prefs + ", key:" + key + ")"); if( key != null ) { updatePreference(prefs, key); setSummary(key); } else { Log.e(TAG, "Preference without key!"); } Log.i(TAG, "- onSharedPreferenceChanged()"); } protected boolean setSummary() { return _setSummary(null); } protected boolean setSummary(String sKey) { return _setSummary(sKey); } private boolean _setSummary(String sKey) { if (sKey == null) Log.i(TAG, "Initializing"); else Log.i(TAG, sKey); // Get Preferences SharedPreferences sharedPrefs = PreferenceManager .getDefaultSharedPreferences(this); // Iterate through all Shared Preferences // http://stackoverflow.com/questions/9310479/how-to-iterate-through-all-keys-of-shared-preferences Map<String, ?> keys = sharedPrefs.getAll(); for (Map.Entry<String, ?> entry : keys.entrySet()) { String key = entry.getKey(); // Do work only if initializing (null) or updating specific preference key if ( (sKey == null) || (sKey.equals(key)) ) { String value = entry.getValue().toString(); Preference pref = findPreference(key); String preference = getPreference(pref); Log.d("map values", key + " | " + value + " | " + preference); pref.setSummary(key + " | " + value + " | " + preference); if (sKey != null) return true; } } return false; } private void updatePreference(SharedPreferences prefs, String key) { Log.i(TAG, "+ updatePreference(prefs:" + prefs + ", key:" + key + ")"); Preference pref = findPreference(key); String preferenceType = getPreference(pref); Log.i(TAG, "preferenceType = " + preferenceType); Log.i(TAG, "- updatePreference()"); } 

Inicializar

Crear una clase pública que PreferenceActivity e implementa OnSharedPreferenceChangeListener

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); PreferenceManager.setDefaultValues(this, R.xml.global_preferences, false); this.addPreferencesFromResource(R.xml.global_preferences); this.getPreferenceScreen().getSharedPreferences() .registerOnSharedPreferenceChangeListener(this); } protected void onResume() { super.onResume(); setSummary(); } 

FYI:

 findPreference(CharSequence key) This method was deprecated in API level 11. This function is not relevant for a modern fragment-based PreferenceActivity. 

Más razones para mirar a la muy astuta Answer de @ASD arriba ( fuente encontrada aquí ) diciendo que usar %s en android:summary para cada campo en preferences.xml . (El valor actual de preferencia se sustituye por %s .)

Introduzca aquí la descripción de la imagen

 <ListPreference ... android:summary="Length of longest word to return as match is %s" ... /> 

Aquí, todos estos se cortan de Eclipse muestra SettingsActivity . Tengo que copiar todos estos códigos demasiado para mostrar cómo estos desarrolladores de Android elegir perfectamente para el estilo de codificación más generalizada y estable.

Dejé los códigos para adaptar el PreferenceActivity a la tableta y el API más grande.

 public class SettingsActivity extends PreferenceActivity { @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); setupSummaryUpdatablePreferencesScreen(); } private void setupSummaryUpdatablePreferencesScreen() { // In the simplified UI, fragments are not used at all and we instead // use the older PreferenceActivity APIs. // Add 'general' preferences. addPreferencesFromResource(R.xml.pref_general); // Bind the summaries of EditText/List/Dialog preferences to // their values. When their values change, their summaries are updated // to reflect the new value, per the Android Design guidelines. bindPreferenceSummaryToValue(findPreference("example_text")); bindPreferenceSummaryToValue(findPreference("example_list")); } /** * A preference value change listener that updates the preference's summary * to reflect its new value. */ private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { private String TAG = SettingsActivity.class.getSimpleName(); @Override public boolean onPreferenceChange(Preference preference, Object value) { String stringValue = value.toString(); if (preference instanceof ListPreference) { // For list preferences, look up the correct display value in // the preference's 'entries' list. ListPreference listPreference = (ListPreference) preference; int index = listPreference.findIndexOfValue(stringValue); // Set the summary to reflect the new value. preference.setSummary( index >= 0 ? listPreference.getEntries()[index] : null); } else { // For all other preferences, set the summary to the value's // simple string representation. preference.setSummary(stringValue); } Log.i(TAG, "pref changed : " + preference.getKey() + " " + value); return true; } }; /** * Binds a preference's summary to its value. More specifically, when the * preference's value is changed, its summary (line of text below the * preference title) is updated to reflect the value. The summary is also * immediately updated upon calling this method. The exact display format is * dependent on the type of preference. * * @see #sBindPreferenceSummaryToValueListener */ private static void bindPreferenceSummaryToValue(Preference preference) { // Set the listener to watch for value changes. preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); // Trigger the listener immediately with the preference's // current value. sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager .getDefaultSharedPreferences(preference.getContext()) .getString(preference.getKey(), "")); } } 

xml/pref_general.xml

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <!-- NOTE: EditTextPreference accepts EditText attributes. --> <!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. --> <EditTextPreference android:capitalize="words" android:defaultValue="@string/pref_default_display_name" android:inputType="textCapWords" android:key="example_text" android:maxLines="1" android:selectAllOnFocus="true" android:singleLine="true" android:title="@string/pref_title_display_name" /> <!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog todismiss it.--> <!-- NOTE: ListPreference's summary should be set to its value by the activity code. --> <ListPreference android:defaultValue="-1" android:entries="@array/pref_example_list_titles" android:entryValues="@array/pref_example_list_values" android:key="example_list" android:negativeButtonText="@null" android:positiveButtonText="@null" android:title="@string/pref_title_add_friends_to_messages" /> </PreferenceScreen> 

values/strings_activity_settings.xml

 <resources> <!-- Strings related to Settings --> <!-- Example General settings --> <string name="pref_title_display_name">Display name</string> <string name="pref_default_display_name">John Smith</string> <string name="pref_title_add_friends_to_messages">Add friends to messages</string> <string-array name="pref_example_list_titles"> <item>Always</item> <item>When possible</item> <item>Never</item> </string-array> <string-array name="pref_example_list_values"> <item>1</item> <item>0</item> <item>-1</item> </string-array> </resources> 

NOTE: Actually I just want to comment like "Google's sample for PreferenceActivity is also interesting". But I haven't enough reputation points.So please don't blame me.

(Sorry for bad English)

Simplemente:

 listPreference.setSummary("%s"); 

You have to use bindPreferenceSummaryToValue function on the onCreate method.

Ejemplo:

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Add 'general' preferences, defined in the XML file addPreferencesFromResource(R.xml.pref_general); // For all preferences, attach an OnPreferenceChangeListener so the UI summary can be // updated when the preference changes. bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_location_key))); bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_units_key))); } 

See lesson 3 on Udacity Android Course: https://www.udacity.com/course/viewer#!/c-ud853/l-1474559101/e-1643578599/m-1643578601

For EditTextPreference :

I came to this solution, of course, just if you need particular edittextpreference but you could do this with every Preference:

…………

 private static final String KEY_EDIT_TEXT_PREFERENCE2 = "on_a1"; public static String value = ""; 

…………

 private void updatePreference(Preference preference, String key) { if (key.equals(KEY_EDIT_TEXT_PREFERENCE2)) { preference = findPreference(key); if (preference instanceof EditTextPreference) { editTextPreference = (EditTextPreference) preference; editTextPreference.setSummary(editTextPreference.getText()); value = editTextPreference.getText().toString(); return; } SharedPreferences sharedPrefs = getPreferenceManager().getSharedPreferences(); preference.setSummary(sharedPrefs.getString(KEY_EDIT_TEXT_PREFERENCE2, "")); } } 

Then in onResume();

 @Override public void onResume() { super.onResume(); SharedPreferences etext = getPreferenceManager().getSharedPreferences(); String str = etext.getString("value", ""); editTextPreference = (EditTextPreference) findPreference(KEY_EDIT_TEXT_PREFERENCE2); editTextPreference.setText(str); editTextPreference.setSummary(editTextPreference.getText()); getPreferenceScreen().getSharedPreferences() .registerOnSharedPreferenceChangeListener(this); } 

En:

 @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { updatePreference(findPreference(key), key); } 

My solution is to create a custom EditTextPreference , used in XML like this: <com.example.EditTextPreference android:title="Example Title" />

EditTextPreference.java :-

 package com.example; import android.content.Context; import android.util.AttributeSet; public class EditTextPreference extends android.preference.EditTextPreference { public EditTextPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public EditTextPreference(Context context, AttributeSet attrs) { super(context, attrs); } public EditTextPreference(Context context) { super(context, null); } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); setSummary(getSummary()); } @Override public CharSequence getSummary() { return getText(); } } 

To set the summary of a ListPreference to the value selected in a dialog you could use this code:

 package yourpackage; import android.content.Context; import android.util.AttributeSet; public class ListPreference extends android.preference.ListPreference { public ListPreference(Context context, AttributeSet attrs) { super(context, attrs); } protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if (positiveResult) setSummary(getEntry()); } protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { super.onSetInitialValue(restoreValue, defaultValue); setSummary(getEntry()); } } 

and reference the yourpackage.ListPreference object in your preferences.xml remembering to specify there your android:defaultValue as this triggers the call to onSetInitialValue() .

If you want you can then modify the text before calling setSummary() to whatever suits your application.

Here is a working solution for all EditTextPreference s inside of a PreferenceFragment based on @tdeveaux answer:

 public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "SettingsFragment"; @Override public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onResume () { super.onResume(); for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); ++i) { Preference preference = getPreferenceScreen().getPreference(i); updatePreference(preference); } } @Override public void onSharedPreferenceChanged (SharedPreferences sharedPreferences, String key) { updatePreference(findPreference(key)); } private void updatePreference (Preference preference) { if (preference instanceof EditTextPreference) { EditTextPreference editTextPreference = (EditTextPreference)preference; editTextPreference.setSummary(editTextPreference.getText()); } } } 

Because I'm using a custom PreferenceDataStore , I can't add a listener to some SharedPreference so I've had to write a somewhat hacky solution that listens to each preference:

 class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener { private val handler: Handler by lazy { Handler(Looper.getMainLooper()) } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { preferenceManager.preferenceDataStore = prefs addPreferencesFromResource(R.xml.app_preferences) onPreferenceChange(preferenceScreen, null) } override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { preference.onPreferenceChangeListener = this when (preference) { is PreferenceGroup -> for (i in 0 until preference.preferenceCount) { onPreferenceChange(preference.getPreference(i), null) } is ListPreference -> { if (preference.value == null) { preference.isPersistent = false preference.value = Preference::class.java.getDeclaredField("mDefaultValue") .apply { isAccessible = true } .get(preference).toString() preference.isPersistent = true } postPreferenceUpdate(Runnable { preference.summary = preference.entry }) } } return true } /** * We can't directly update the preference summary update because [onPreferenceChange]'s result * is used to decide whether or not to update the pref value. */ private fun postPreferenceUpdate(r: Runnable) = handler.post(r) } 
  • Trabajar con diseñadores de Android
  • Pasar al siguiente fragmento con un clic de botón
  • Vista personalizada como bloqueo / desbloqueo de la pantalla de Android
  • ¿Mueve los diseños cuando se muestra el teclado suave?
  • Recortar el área circular del mapa de bits en Android
  • ¿Cómo diseñar una aplicación Android adecuada? Consejos y trucos
  • WebView Atrás, Actualizar, Reenviar? Simplemente no funciona!
  • Recuperación y análisis de datos de iCal a través de HTTP en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.