475 votes

Comment puis-je afficher la valeur actuelle d'une préférence Android dans le résumé des préférences?

Cela doit venir très souvent.

Lorsque l'utilisateur est la modification des préférences dans une application Android, je voudrais qu'ils soient en mesure de voir la valeur de la préférence dans l' Preference résumé.

Exemple: si j'ai une Préférence pour "Jeter les vieux messages", qui spécifie le nombre de jours après lequel les messages ont besoin d'être nettoyé. Dans l' PreferenceActivity j'aimerais que l'utilisateur puisse voir:

"Jeter les vieux messages" <- titre

"Nettoyer les messages après x jours" <- résuméx est l'actuelle valeur de Préférence

Le crédit supplémentaire de faire de cette réutilisables, donc je peux facilement l'appliquer à tous mes préférences, indépendamment de leur type (de sorte qu'il travail avec EditTextPreference, ListPreference etc. avec un minimum de codage).

155voto

DozenCrows Points 964

Il existe des moyens pour faire une plus générique solution, si cela convient à vos besoins.

Par exemple, si vous voulez génériquement ont tous la liste des préférences de montrer leur choix en résumé, vous pourriez avoir ce pour votre onSharedPreferenceChanged mise en œuvre:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference pref = findPreference(key);

    if (pref instanceof ListPreference) {
        ListPreference listPref = (ListPreference) pref;
        pref.setSummary(listPref.getEntry());
    }
}

Ceci est facilement extensible à d'autres catégories de préférence.

Et en utilisant l' getPreferenceCount et getPreference fonctionnalités en PreferenceScreen et PreferenceCategory, vous pouvez facilement écrire une fonction générique à pied de la préférence de l'arborescence de configuration, les résumés de toutes les préférences de types que vous le désir de leur toString représentation

144voto

EddieB Points 2646

Voici ma solution ... 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().contains("assword"))
            {
                p.setSummary("******");
            } else {
                p.setSummary(editTextPref.getText());
            }
        }
        if (p instanceof MultiSelectListPreference) {
            EditTextPreference editTextPref = (EditTextPreference) p;
            p.setSummary(editTextPref.getText());
        }
    }
}
 

104voto

Robertas Points 86

La documentation Android indique qu'il est possible d'utiliser un marqueur de mise en forme de chaîne dans getSummary() :

Si le résumé a un marqueur de formatage de chaîne (par exemple "% s" ou "% 1 $ s"), alors la valeur d'entrée actuelle sera substituée à sa place.

Le simple fait de spécifier android:summary="Clean up messages after %s days" dans la déclaration xml ListPreference a fonctionné pour moi.

83voto

tdevaux Points 381

Si vous utilisez PreferenceFragment , voici comment je l'ai résolu. C'est explicite.

 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) {
            updatePreference(preferenceGroup.getPreference(j));
          }
        } else {
          updatePreference(preference);
        }
      }
    }

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

    private void updatePreference(Preference preference) {
      if (preference instanceof ListPreference) {
        ListPreference listPreference = (ListPreference) preference;
        listPreference.setSummary(listPreference.getEntry());
      }
    }
  }
 

33voto

Youyougoslave Points 412

Mon option est d'étendre ListPreference et c'est propre:

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

Ensuite, vous ajoutez dans votre settings.xml:

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

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