Cela doit arriver très souvent.
Lorsque l'utilisateur modifie les préférences dans une application Android, j'aimerais qu'il puisse voir la valeur actuellement définie de la préférence dans le Preference
résumé.
Exemple: si j'ai un paramètre de préférence pour "Supprimer les anciens messages" qui spécifie le nombre de jours après lesquels les messages doivent être nettoyés. Dans le PreferenceActivity
J'aimerais que l'utilisateur voie:
"Supprimer les anciens messages" <- title
"Nettoyer les messages après x jours" <- résumé où x est la valeur de préférence actuelle
Crédit supplémentaire: rendez-le réutilisable, afin que je puisse facilement l'appliquer à toutes mes préférences, quel que soit leur type (pour qu'il fonctionne avec EditTextPreference, ListPreference, etc. avec un minimum de codage).
implements OnSharedPreferenceChangeListener
"%s"
pourListPreference
etListPreference.getSummary()
formaterez le résumé avec l'entrée en cours sélectionné (ou""
si aucun sélectionné).Voici ma solution ... FWIW
la source
EditTextPreference
estandroid:password="true"
elle montre la valeurif editTextPref.getText() == ""
)? Comment obtenir une valeur récapitulative àupdatePrefSummary
?p.getSummary()
eteditTextPref.getSummary()
retourner des valeurs déjà modifiées.PreferenceCategory
etPreferenceScreen
héritant dePreferenceGroup
, j'ai changéinitSummary
pour gérer un à laPreferenceGroup
place. Cela évite le besoin d'une autre boucleonCreate()
. Changement de comportement: les PreferenceScreens imbriqués sont désormais également gérés de manière récursive.La documentation Android indique que l'on peut utiliser un marqueur de formatage de chaîne dans
getSummary()
:android:summary="Clean up messages after %s days"
Spécifier simplement dans la déclaration XML ListPreference a fonctionné pour moi.Remarque: cela ne fonctionne que pour
ListPreference
.la source
android:defaultValue="0"
dans votre ListPreference. Ceci est la réponse la plus sensée et fonctionne pour moi.defaultValue
et le%s
ne fonctionnent pas. Sur les autres versions, cela fonctionne généralement. Une solution s'il vous plait? Je ne veux certainement pas écrire une classe personnalisée pour cela. Incroyable que Google rend la tâche la plus triviale aussi pénible.Si vous utilisez
PreferenceFragment
, c'est comme ça que je l'ai résolu. C'est explicite.la source
updatePreference
CODEif (preference instanceof EditTextPreference) { EditTextPreference editTextPref = (EditTextPreference) preference; preference.setSummary(editTextPref.getText()); }
merci @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
(et plusieurs autres méthodes), car Google veut que vous passiez à la technique indiquée dans cette réponse, qui utilise à laPreferenceFragment.findPreference
place.Mon option est d'étendre ListPreference et c'est propre:
Ensuite, vous ajoutez dans votre settings.xml:
la source
init()
fonction est nécessaire pour mettre à jour lesummary
lorsque l'utilisateur modifie cette préférence. Sans cela, il restera simplement quelle que soit l'entrée au départ.Vous pouvez remplacer les classes de préférence par défaut et implémenter la fonctionnalité.
Plus tard dans votre xml, vous pouvez utiliser des préférences personnalisées comme
la source
Après plusieurs heures passées à résoudre un tel problème, j'ai implémenté ce code:
[MISE À JOUR: la liste des versions finales]
C'était la seule solution qui fonctionnait bien pour moi. Avant, j'ai essayé de sous-classer ListPreferences et d'implémenter android: summary = "bla bla bla% s". Aucun n'a fonctionné.
la source
Peut-être comme ListPreference: Modifiez getSummary pour obtenir ce que vous voulez:
Et utilisez ceci dans votre xml:
Vous pouvez donc écrire un résumé avec
%s
au lieu de la valeur réelle.la source
android.support.v7.preference.EditTextPreference
, cela ne met pas à jour le résumé lorsque la préférence est modifiée, uniquement lorsque l'activité des préférences est créée. Un moyen de contourner cela sans implémenterOnSharedPreferenceChangeListener.onSharedPreferenceChanged
dans la classe de fragment de préférences est de surcharger égalementandroid.support.v7.preference.EditTextPreference.setText(String text)
:@Override public void setText(String text) { super.setText(text); this.setSummary(this.getText()); }
Il s'agit du code dont vous avez besoin pour définir le résumé sur la valeur choisie. Il définit également les valeurs au démarrage et respecte les valeurs par défaut, non seulement au changement. Modifiez simplement "R.layout.prefs" dans votre fichier xml et étendez la méthode setSummary à vos besoins. En fait, il ne gère que ListPreferences, mais il est facile à personnaliser pour respecter les autres préférences.
Koem
la source
setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener onPreferenceChangeListener)
méthode des préférences individuelles.En fait, CheckBoxPreference a la possibilité de spécifier un résumé différent en fonction de la valeur de la case à cocher. Voir les attributs android: summaryOff et android: summaryOn (ainsi que les méthodes CheckBoxPreference correspondantes).
la source
Pour EditTextPreference:
la source
Si quelqu'un cherche toujours des réponses à cette question, vous devriez vérifier la réponse de trente-trois ans .
la source
Merci pour cette astuce!
J'ai un écran de préférence et je souhaite afficher la valeur de chaque préférence de liste comme résumé.
C'est ma voie maintenant:
Cela fonctionne pour moi, mais je me demande quelle est la meilleure solution (performances, stabilité, évolutivité): celle que Koem montre ou celle-ci?
la source
Merci, Reto, pour l'explication détaillée!
Au cas où cela serait utile à quiconque, j'ai dû changer le code proposé par Reto Meier pour le faire fonctionner avec le SDK pour Android 1.5
Le même changement s'applique à la fonction de rappel
onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
À votre santé,
Chris
la source
J'ai résolu le problème avec le descendant suivant de ListPreference:
Semble bien fonctionner pour moi dans 1.6 jusqu'à 4.0.4.
la source
la source
J'ai vu toutes les réponses votées montrer comment définir le résumé avec la valeur actuelle exacte, mais l'OP voulait également quelque chose comme:
Voici ma réponse pour y parvenir
Comme le dit la documentation sur
ListPreference.getSummary()
:Cependant, j'ai essayé sur plusieurs appareils et cela ne semble pas fonctionner. Avec quelques recherches, j'ai trouvé une bonne solution dans cette réponse . Il consiste simplement à étendre tout ce que
Preference
vous utilisez et à remplacergetSummary()
pour qu'il fonctionne comme spécifié par la documentation Android.la source
Si vous souhaitez uniquement afficher la valeur en texte brut de chaque champ comme résumé, le code suivant doit être le plus facile à gérer. Il ne nécessite que deux modifications (lignes 13 et 21, marquées "changer ici"):
la source
Voici ma solution:
Construisez une méthode de type getter de préférence.
Créez une méthode 'setSummaryInit'.
Initialiser
Créer une classe publique qui PreferenceActivity et implémente OnSharedPreferenceChangeListener
la source
Simplement:
la source
Pour info:
Raison de plus pour regarder le très lisse
Answer
de @ASD ci-dessus ( source trouvée ici ) disant d'utiliser%s
inandroid:summary
pour chaque champ danspreferences.xml
. (La valeur actuelle de préférence est remplacée%s
.)la source
Étant donné que dans la classe de préférences androidx a l' interface SummaryProvider , cela peut être fait sans OnSharedPreferenceChangeListener. Des implémentations simples sont fournies pour EditTextPreference et ListPreference. En s'appuyant sur la réponse d'EddieB, cela peut ressembler à ceci. Testé sur androidx.preference: préférence: 1.1.0-alpha03.
la source
Selon les documents Android, vous pouvez utiliser les
app:useSimpleSummaryProvider="true"
composants ListPreference et EditTextPreference.la source
Ici, tous ceux-ci sont coupés de l'échantillon Eclipse
SettingsActivity
. Je dois copier tous ces codes trop pour montrer comment ces développeurs Android choisissent parfaitement pour un style de codage plus généralisé et plus stable.J'ai laissé les codes pour l'adaptation
PreferenceActivity
à la tablette et à une plus grande API.xml/pref_general.xml
values/strings_activity_settings.xml
REMARQUE: En fait, je veux juste commenter comme "l'exemple de Google pour PreferenceActivity est également intéressant". Mais je n'ai pas assez de points de réputation, alors ne m'en voulez pas.
(Désolé pour mon mauvais anglais)
la source
Vous devez utiliser la fonction bindPreferenceSummaryToValue sur la méthode onCreate.
Exemple:
Voir la leçon 3 sur le cours Udacity Android: https://www.udacity.com/course/viewer#!/c-ud853/l-1474559101/e-1643578599/m-1643578601
la source
Pour EditTextPreference :
Je suis venu à cette solution, bien sûr, juste si vous avez besoin d'une edittextpreference particulière, mais vous pouvez le faire avec chaque préférence:
............
............
Puis dans onResume ();
Dans:
la source
Ma solution est de créer un custom
EditTextPreference
, utilisé en XML comme ceci:<com.example.EditTextPreference android:title="Example Title" />
EditTextPreference.java : -
la source
Pour définir le résumé de a
ListPreference
sur la valeur sélectionnée dans une boîte de dialogue, vous pouvez utiliser ce code:et référencez l'
yourpackage.ListPreference
objet dans votrepreferences.xml
mémoire pour y spécifier votreandroid:defaultValue
car cela déclenche l'appel àonSetInitialValue()
.Si vous le souhaitez, vous pouvez ensuite modifier le texte avant d'appeler
setSummary()
ce qui convient à votre application.la source
Parce que j'utilise une coutume
PreferenceDataStore
, je ne peux pas ajouter d'écouteur à certainsSharedPreference
, j'ai donc dû écrire une solution quelque peu hacky qui écoute chaque préférence:la source
Si vous utilisez AndroidX, vous pouvez utiliser une personnalisation
SummaryProvider
. Cette approche peut être utilisée pour toutPreference
.Exemple de documentation (Java):
Exemple de documentation (Kotlin):
la source