477 Stimmen

Wie kann ich den aktuellen Wert einer Android-Einstellung in der Einstellungsübersicht anzeigen?

Das muss sehr oft vorkommen.

Wenn der Benutzer die Einstellungen in einer Android-App bearbeitet, möchte ich, dass er den aktuell eingestellten Wert der Einstellung im Feld Preference Zusammenfassung.

Beispiel: Ich habe eine Einstellung für "Alte Nachrichten verwerfen", die die Anzahl der Tage angibt, nach denen Nachrichten bereinigt werden müssen. In der PreferenceActivity Ich möchte, dass der Benutzer das sieht:

"Alte Nachrichten verwerfen" <- Titel

"Nachrichten bereinigen nach x Tage" <- Zusammenfassung wobei x ist der aktuelle Präferenzwert

Extra Kredit: machen Sie diese wiederverwendbar, so kann ich leicht gelten es für alle meine Präferenzen unabhängig von ihrem Typ (so dass es mit EditTextPreference, ListPreference etc. mit minimalen Betrag der Codierung arbeiten).

155voto

DozenCrows Punkte 1692

Es gibt Möglichkeiten, dies zu einer allgemeineren Lösung zu machen, wenn dies Ihren Bedürfnissen entspricht.

Wenn Sie z.B. generell alle Listeneinstellungen als Zusammenfassung anzeigen lassen wollen, könnten Sie dies für Ihre onSharedPreferenceChanged Umsetzung:

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

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

Dies ist leicht auf andere Präferenzklassen erweiterbar.

Und durch die Verwendung des getPreferenceCount y getPreference Funktionalität in PreferenceScreen y PreferenceCategory können Sie leicht eine generische Funktion schreiben, die den Präferenzbaum durchläuft und die Zusammenfassungen aller Präferenzen der von Ihnen gewünschten Typen auf deren toString Vertretung

144voto

EddieB Punkte 4923

Hier ist meine Lösung... 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().toLowerCase().contains("password"))
            {
                p.setSummary("******");
            } else {
                p.setSummary(editTextPref.getText());
            }
        }
        if (p instanceof MultiSelectListPreference) {
            EditTextPreference editTextPref = (EditTextPreference) p;
            p.setSummary(editTextPref.getText());
        }
    }
}

104voto

Robertas Punkte 1640

Android Dokumentation sagt, dass man eine String-Formatierungsmarkierung in getSummary() :

Wenn die Zusammenfassung eine String-Formatierungsmarkierung enthält (z. B. "%s" oder "%1$s"), wird der aktuelle Eintragswert an dessen Stelle gesetzt.

Einfach die Angabe android:summary="Clean up messages after %s days" in der ListPreference xml-Deklaration hat bei mir funktioniert.

Note : Dies funktioniert nur bei ListPreference .

84voto

tdevaux Punkte 1812

Wenn Sie PreferenceFragment Ich habe das Problem folgendermaßen gelöst. Es ist selbsterklärend.

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

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

    private void updatePreference(Preference preference, String key) {
      if (preference == null) return;
      if (preference instanceof ListPreference) {
        ListPreference listPreference = (ListPreference) preference;
        listPreference.setSummary(listPreference.getEntry());
        return;
      }
      SharedPreferences sharedPrefs = getPreferenceManager().getSharedPreferences();
      preference.setSummary(sharedPrefs.getString(key, "Default"));
    }
  }

33voto

Youyougoslave Punkte 551

Meine Option ist, ListPreference zu erweitern und es ist sauber:

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

Dann fügen Sie Ihre settings.xml hinzu:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X