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!
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!
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é.
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;
}
});
}
}
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.
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);
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 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.