Esto debe suceder muy a menudo.
Cuando el usuario está editando preferencias en una aplicación de Android, me gustaría que puedan ver el valor establecido actualmente de la preferencia en el Preference
resumen.
Ejemplo: si tengo una configuración de Preferencia para "Descartar mensajes antiguos" que especifica el número de días después de los cuales los mensajes deben limpiarse. En el PreferenceActivity
me gustaría que el usuario vea:
"Descartar mensajes antiguos" <- título
"Limpiar mensajes después de x días" <- resumen donde x es el valor de preferencia actual
Crédito adicional: haga que esto sea reutilizable, para que pueda 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).
implements OnSharedPreferenceChangeListener
"%s"
paraListPreference
yListPreference.getSummary()
formateará el resumen con la entrada seleccionada actual (o""
si no se seleccionó ninguna).Aquí está mi solución ... FWIW
fuente
EditTextPreference
esandroid:password="true"
que muestra el valorif editTextPref.getText() == ""
)? ¿Cómo obtener un valor de resumen enupdatePrefSummary
?p.getSummary()
yeditTextPref.getSummary()
devolver valores ya modificados.PreferenceCategory
yPreferenceScreen
heredar dePreferenceGroup
, he cambiadoinitSummary
para manejar unPreferenceGroup
en su lugar. Esto evita la necesidad de otro bucleonCreate()
. Cambio de comportamiento: las PreferenceScreens anidadas ahora también se manejan de forma recursiva.La documentación de Android dice que se puede usar un marcador de formato de cadena en
getSummary()
:Simplemente especificar
android:summary="Clean up messages after %s days"
en la declaración XML ListPreference funcionó para mí.Nota: Esto solo funciona para
ListPreference
.fuente
android:defaultValue="0"
en su ListPreference. Esta es la respuesta más sensata y funciona para mí.defaultValue
y el%s
no funcionan. En otras versiones, en general, funciona. ¿Alguna solución por favor? Estoy seguro de que no quiero escribir una clase personalizada para esto. Increíble que Google haga que las tareas más triviales sean tan dolorosas.Si lo usas
PreferenceFragment
, así es como lo resolví. Se explica por sí mismo.fuente
updatePreference
CODEif (preference instanceof EditTextPreference) { EditTextPreference editTextPref = (EditTextPreference) preference; preference.setSummary(editTextPref.getText()); }
gracias @EddieBunregisterOnSharedPreferenceChangeListener
?findPreference(CharSequence key) This method was deprecated in API level 11. This function is not relevant for a modern fragment-based PreferenceActivity.
PreferenceActivity.findPreference
(y varios otros métodos), porque Google quiere que cambie a la técnica que se muestra en esta respuesta, que usa en suPreferenceFragment.findPreference
lugar.Mi opción es extender ListPreference y está limpio:
Luego agrega en su settings.xml:
fuente
init()
función es necesaria para actualizarsummary
cuando el usuario cambia esa preferencia. Sin ella, se mantendrá independientemente de la entrada inicial.Puede anular las clases de preferencias predeterminadas e implementar la función.
Más adelante en tu xml puedes usar preferencias personalizadas como
fuente
Después de varias horas dedicadas a resolver este problema, implementé este código:
[ACTUALIZACIÓN: el listado de la versión final]
Esa fue la única solución que me funcionó bien. Antes de intentar subclase de ListPreferences e implementar android: summary = "bla bla bla% s". Ninguno funcionó.
fuente
Tal vez como ListPreference: Modifique getSummary para obtener lo que desea:
Y usa esto en tu xml:
Entonces puede escribir un resumen en
%s
lugar del valor real.fuente
android.support.v7.preference.EditTextPreference
, esto no actualiza el resumen cuando se cambia la preferencia, solo cuando se crea la actividad de preferencias. Una forma de evitar esto sin implementarOnSharedPreferenceChangeListener.onSharedPreferenceChanged
en la clase de fragmento de preferencias es anular tambiénandroid.support.v7.preference.EditTextPreference.setText(String text)
:@Override public void setText(String text) { super.setText(text); this.setSummary(this.getText()); }
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 solo en el cambio. Simplemente cambie "R.layout.prefs" a su archivo xml y extienda el método setSummary a sus necesidades. En realidad, solo está manejando ListPreferences, pero es fácil de personalizar para respetar otras preferencias.
koem
fuente
setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener onPreferenceChangeListener)
método de preferencias individuales.En realidad, CheckBoxPreference tiene la capacidad de especificar un resumen diferente en función del valor de la casilla de verificación. Consulte los atributos android: summaryOff y android: summaryOn (así como los métodos CheckBoxPreference correspondientes).
fuente
Para EditTextPreference:
fuente
Si alguien todavía está buscando respuestas a esto, debe consultar treinta y tres respuestas.
fuente
Gracias por este consejo!
Tengo una pantalla de preferencia y quiero mostrar el valor de cada preferencia de lista como resumen.
Este es mi camino ahora:
Esto funciona para mí, pero me pregunto cuál es la mejor solución (rendimiento, estabilidad, escalabilidad): ¿la que está mostrando Koem o esta?
fuente
¡Gracias, Reto, por la explicación detallada!
En caso de que esto sea de alguna ayuda para alguien, tuve que cambiar el código propuesto por Reto Meier para que funcione con el SDK para Android 1.5
Se aplica el mismo cambio para la función de devolución de llamada
onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
Salud,
Chris
fuente
Resolví el problema con el siguiente descendiente de ListPreference:
Parece funcionar bien para mí en 1.6 hasta 4.0.4.
fuente
fuente
He visto que todas las respuestas votadas muestran cómo configurar el resumen con el valor actual exacto, pero el OP también quería algo como:
Aquí está mi respuesta para lograr eso
Como dice la documentación sobre
ListPreference.getSummary()
:Sin embargo, probé en varios dispositivos y no parece funcionar. Con un poco de investigación, encontré una buena solución en esta respuesta . Simplemente consiste en extender todo lo
Preference
que usa y anulargetSummary()
para que funcione como se especifica en la documentación de Android.fuente
Si solo desea mostrar el valor de texto sin formato de cada campo como su resumen, el siguiente código debería ser el más fácil de mantener. Solo requiere dos cambios (líneas 13 y 21, marcadas con "cambiar aquí"):
fuente
Aquí está mi solución:
Construya un método de tipo 'getter' de preferencia.
Cree un método 'setSummaryInit'.
Inicializar
Cree una clase pública que PreferenceActivity e implemente OnSharedPreferenceChangeListener
fuente
Simplemente:
fuente
FYI:
Razón de más para mirar el muy hábil
Answer
de @ASD arriba ( fuente encontrada aquí ) que dice usar%s
enandroid:summary
cada campopreferences.xml
. (Se sustituye el valor actual de preferencia%s
).fuente
Dado que en la clase de preferencia androidx tiene la interfaz SummaryProvider , se puede hacer sin OnSharedPreferenceChangeListener. Se proporcionan implementaciones simples para EditTextPreference y ListPreference. Sobre la base de la respuesta de EddieB, puede verse así. Probado en androidx.preference: preferencia: 1.1.0-alpha03.
fuente
De acuerdo con los documentos de Android que puede usar
app:useSimpleSummaryProvider="true"
en los componentes ListPreference y EditTextPreference.fuente
Aquí, todos estos se cortan de la muestra Eclipse
SettingsActivity
. Tengo que copiar todos estos códigos demasiado para mostrar cómo estos desarrolladores de Android eligen perfectamente para un estilo de codificación más generalizado y estable.Dejé los códigos para adaptar la
PreferenceActivity
tableta a una API mayor.xml/pref_general.xml
values/strings_activity_settings.xml
NOTA: En realidad solo quiero comentar como "La muestra de Google para PreferenceActivity también es interesante". Pero no tengo suficientes puntos de reputación, así que por favor no me culpen.
(Perdón por el mal inglés)
fuente
Debe usar la función bindPreferenceSummaryToValue en el método onCreate.
Ejemplo:
Consulte la lección 3 sobre el curso de Android Udacity: https://www.udacity.com/course/viewer#!/c-ud853/l-1474559101/e-1643578599/m-1643578601
fuente
Para EditTextPreference :
Llegué a esta solución, por supuesto, solo si necesita una preferencia de edición de texto particular, pero podría hacer esto con cada Preferencia:
............
............
Luego en onResume ();
En:
fuente
Mi solución es crear un personalizado
EditTextPreference
, utilizado en XML como este:<com.example.EditTextPreference android:title="Example Title" />
EditTextPreference.java : -
fuente
Para establecer el resumen de
ListPreference
a en el valor seleccionado en un cuadro de diálogo, puede usar este código:y haga referencia al
yourpackage.ListPreference
objeto en supreferences.xml
memoria para especificar allí suandroid:defaultValue
como esto activa la llamada aonSetInitialValue()
.Si lo desea, puede modificar el texto antes de llamar
setSummary()
a lo que sea adecuado para su aplicación.fuente
Debido a que estoy usando una costumbre
PreferenceDataStore
, no puedo agregar un oyente a algunos,SharedPreference
así que tuve que escribir una solución algo hacky que escuche cada preferencia:fuente
Si está utilizando AndroidX, puede usar una personalizada
SummaryProvider
. Este enfoque puede usarse para cualquieraPreference
.Ejemplo de documentación (Java):
Ejemplo de documentación (Kotlin):
fuente