121 votes

Préférences de liste Android: avez-vous résumé comme valeur sélectionnée?

J'ai une activité Préférence qui utilise les préférences de liste définies par mon fichier XML. Comment définirais-je le résumé de l'activité de liste sur la valeur sélectionnée?

Je vous remercie!

429voto

thirtythreeforty Points 1664

Le moyen le plus simple pour ce faire est simplement d'avoir Android de le faire pour vous. En supposant que vous voulez le résumé de match de la valeur sélectionnée, vous pouvez simplement définir le résumé de l' ListPreference de "%s". Par exemple:

<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 remplacera %s avec le courant de la chaîne de valeur de la préférence affichée par l' ListPreference's sélecteur.

J'ai passé beaucoup trop de temps à coucher avec des SharedPreferences des auditeurs avant que je découvre cette. En bonus, la liste du sommaire sera réglé correctement lorsque vous entrez dans l'activité.

28voto

Axel Points 335

Vous pouvez utiliser OnPreferenceChangeListener pour modifier dynamiquement le résumé. Le problème est qu’il obtient la valeur sélectionnée (de android:entryValues ), pas la légende ( android:entries ). Dans le code suivant, j'ai utilisé toString() , mais la solution appropriée consiste à rechercher le libellé de la valeur. En tout cas, l'idée fonctionne:

 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;
            }
        });
    }
}
 

17voto

silverback Points 3108

J'ai aussi voulu réaliser quelque chose de similaire, mais le problème avec http://stackoverflow.com/a/8155029/592025 c'est que, il affiche la valeur de mes choix (comme 1, 2 3, etc). J'en veux pour preuve l'entrée (lisible par l'homme string) correspondant à la valeur sélectionnée.

Alors je l'ai changé de cette façon, et fonctionne de la façon dont j'en ai besoin.

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;
        }
    });

L'astuce est d'utiliser getEntry() au lieu de getValue() et une fois que la valeur est modifiée, la valeur est définie de façon explicite et lire l'entrée.

3voto

cottonBallPaws Points 5384

Commencez par obtenir une référence à ListPreference dans votre onCreate. Vous pouvez utiliser findPreference (). Par exemple:

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

Ensuite, lorsque vous chargez l'activité pour la première fois et chaque fois que la valeur des préférences est modifiée, utilisez la méthode de votre choix pour obtenir la valeur de ListPreference et définissez le résumé avec:

 pref.setSummary(theNewString);
 

2voto

Moberg Points 658

C'est le code que j'utilise, il n'appelle pas setValue manuellement, car je pense que cela est déjà fait à un stade ultérieur.

Voici un exemple:

 @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;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X