Dies muss sehr oft vorkommen.
Wenn der Benutzer Einstellungen in einer Android-App bearbeitet, möchte er, dass er den aktuell festgelegten Wert der Einstellungen in der Preference
Zusammenfassung sehen kann.
Beispiel: Wenn ich eine Voreinstellung für "Alte Nachrichten verwerfen" habe, die die Anzahl der Tage angibt, nach denen Nachrichten bereinigt werden müssen. In der PreferenceActivity
möchte ich den Benutzer sehen:
"Alte Nachrichten verwerfen" <- Titel
"Nachrichten nach x Tagen bereinigen " <- Zusammenfassung, wobei x der aktuelle Voreinstellungswert ist
Zusätzliches Guthaben: Machen Sie dies wiederverwendbar, damit ich es unabhängig von ihrem Typ problemlos auf alle meine Einstellungen anwenden kann (damit es mit EditTextPreference, ListPreference usw. mit minimalem Codierungsaufwand funktioniert).
implements OnSharedPreferenceChangeListener
"%s"
für einstellenListPreference
undListPreference.getSummary()
die Zusammenfassung mit dem aktuell ausgewählten Eintrag formatieren (oder""
falls keiner ausgewählt ist).Hier ist meine Lösung ... FWIW
quelle
EditTextPreference
istandroid:password="true"
es , den Wert zeigtif editTextPref.getText() == ""
)? Wie erhalte ich einen zusammenfassenden Wert beiupdatePrefSummary
?p.getSummary()
undeditTextPref.getSummary()
geben Sie bereits geänderte Werte zurück.PreferenceCategory
und vonPreferenceScreen
erbenPreferenceGroup
, habe ich geändertinitSummary
, umPreferenceGroup
stattdessen ein zu behandeln . Dies vermeidet die Notwendigkeit einer weiteren SchleifeonCreate()
. Verhaltensänderung: Verschachtelte PreferenceScreens werden jetzt auch rekursiv behandelt.Laut Android- Dokumentation kann ein String-Formatierungsmarker verwendet werden in
getSummary()
:Das
android:summary="Clean up messages after %s days"
einfache Angeben in der ListPreference-XML-Deklaration hat bei mir funktioniert.Hinweis: Dies funktioniert nur für
ListPreference
.quelle
android:defaultValue="0"
in Ihrer ListPreference angegeben wird. Dies ist die vernünftigste Antwort und funktioniert für mich.defaultValue
und die%s
nicht. Bei anderen Versionen funktioniert es jedoch im Allgemeinen. Irgendeine Lösung bitte? Ich möchte sicher keine benutzerdefinierte Klasse dafür schreiben. Unglaublich, dass Google die trivialsten Aufgaben so schmerzhaft macht.Wenn Sie verwenden
PreferenceFragment
, habe ich es so gelöst. Es ist selbsterklärend.quelle
updatePreference
CODE hinzu.if (preference instanceof EditTextPreference) { EditTextPreference editTextPref = (EditTextPreference) preference; preference.setSummary(editTextPref.getText()); }
Danke @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
(und mehrere andere Methoden) zu verwenden, da Google möchte, dass Sie zu der in dieser Antwort gezeigten Technik wechseln, diePreferenceFragment.findPreference
stattdessen verwendet wird.Meine Option ist, ListPreference zu erweitern und es ist sauber:
Dann fügen Sie in Ihrer settings.xml hinzu:
quelle
init()
Funktion ist erforderlich, um zu aktualisieren,summary
wann der Benutzer diese Einstellung ändert. Ohne es bleibt es einfach, was auch immer der Eintrag ursprünglich war.Sie können Standardeinstellungsklassen überschreiben und die Funktion implementieren.
Später in Ihrer XML können Sie benutzerdefinierte Einstellungen wie verwenden
quelle
Nach einigen Stunden, die ich damit verbracht habe, ein solches Problem zu lösen, habe ich diesen Code implementiert:
[UPDATE: die endgültige Versionsliste]
Das war die einzige Lösung, die für mich gut funktioniert hat. Bevor ich versucht habe, eine Unterklasse von ListPreferences zu erstellen und Android zu implementieren: summary = "bla bla bla% s". Beides hat nicht funktioniert.
quelle
Vielleicht wie ListPreference: Ändern Sie getSummary, um das zu erhalten, was Sie wollen:
Und verwenden Sie dies in Ihrer XML:
Sie können also
%s
anstelle des tatsächlichen Werts eine Zusammenfassung mit schreiben .quelle
android.support.v7.preference.EditTextPreference
wird die Zusammenfassung nicht aktualisiert, wenn die Voreinstellung geändert wird, sondern nur, wenn die Voreinstellungsaktivität erstellt wird. Ein Weg, dies zuOnSharedPreferenceChangeListener.onSharedPreferenceChanged
android.support.v7.preference.EditTextPreference.setText(String text)
@Override public void setText(String text) { super.setText(text); this.setSummary(this.getText()); }
Dies ist der Code, den Sie benötigen, um die Zusammenfassung auf den ausgewählten Wert zu setzen. Außerdem werden die Werte beim Start festgelegt und die Standardwerte werden nicht nur beim Ändern berücksichtigt. Ändern Sie einfach "R.layout.prefs" in Ihre XML-Datei und erweitern Sie die setSummary-Methode nach Ihren Wünschen. Es werden eigentlich nur ListPreferences behandelt, aber es ist einfach anzupassen, um andere Einstellungen zu berücksichtigen.
Koem
quelle
setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener onPreferenceChangeListener)
Methode der einzelnen Einstellungen abgehört werden .Tatsächlich kann CheckBoxPreference basierend auf dem Kontrollkästchenwert eine andere Zusammenfassung angeben. Siehe die Attribute android: summaryOff und android: summaryOn (sowie die entsprechenden CheckBoxPreference-Methoden).
quelle
Für EditTextPreference:
quelle
Wenn jemand immer noch nach Antworten darauf sucht, sollten Sie die Antwort von dreiunddreißig lesen .
quelle
Danke für diesen Tipp!
Ich habe einen Einstellungsbildschirm und möchte den Wert für jede Listeneinstellung als Zusammenfassung anzeigen.
Das ist jetzt mein Weg:
Das funktioniert bei mir, aber ich frage mich, was die beste Lösung ist (Leistung, Stabilität, Skalierbarkeit): die, die Koem zeigt, oder diese?
quelle
Danke, Reto, für die ausführliche Erklärung!
Für den Fall, dass dies jemandem hilft, musste ich den von Reto Meier vorgeschlagenen Code ändern, damit er mit dem SDK für Android 1.5 funktioniert
Die gleiche Änderung gilt für die Rückruffunktion
onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
Prost,
Chris
quelle
Ich habe das Problem mit dem folgenden Nachkommen von ListPreference gelöst:
Scheint für mich in 1.6 bis 4.0.4 gut zu funktionieren.
quelle
quelle
Ich habe gesehen, dass alle abgestimmten Antworten zeigen, wie die Zusammenfassung mit dem genauen aktuellen Wert eingestellt wird, aber das OP wollte auch so etwas wie:
Hier ist meine Antwort, um das zu erreichen
Wie die Dokumentation sagt über
ListPreference.getSummary()
:Ich habe es jedoch auf mehreren Geräten versucht und es scheint nicht zu funktionieren. Mit einigen Recherchen habe ich in dieser Antwort eine gute Lösung gefunden . Es besteht einfach darin, alles, was
Preference
Sie verwenden und überschreiben, sogetSummary()
zu erweitern, dass es wie in der Android-Dokumentation angegeben funktioniert.quelle
Wenn Sie nur den Klartextwert jedes Felds als Zusammenfassung anzeigen möchten, sollte der folgende Code am einfachsten zu pflegen sein. Es sind nur zwei Änderungen erforderlich (Zeilen 13 und 21, gekennzeichnet mit "hier ändern"):
quelle
Hier ist meine Lösung:
Erstellen Sie eine Einstellungsmethode vom Typ 'getter'.
Erstellen Sie eine 'setSummaryInit'-Methode.
Initialisieren
Erstellen Sie eine öffentliche Klasse, die PreferenceActivity und OnSharedPreferenceChangeListener implementiert
quelle
Einfach:
quelle
Zu Ihrer Information:
Umso mehr Grund zu Blick auf die sehr glatt
Answer
von @ASD oben ( Quelle hier ) sagen zu verwenden ,%s
inandroid:summary
in für jedes Feldpreferences.xml
. (Der aktuelle Präferenzwert wird ersetzt%s
.)quelle
Da in Androidx Preference Klasse hat die SummaryProvider- Schnittstelle vorhanden ist, kann dies ohne OnSharedPreferenceChangeListener erfolgen. Für EditTextPreference und ListPreference werden einfache Implementierungen bereitgestellt. Aufbauend auf EddieBs Antwort kann es so aussehen. Getestet auf androidx.preference: Präferenz: 1.1.0-alpha03.
quelle
Laut Android-Dokumenten können Sie die
app:useSimpleSummaryProvider="true"
Komponenten ListPreference und EditTextPreference verwenden.quelle
Hier werden alle diese aus der Eclipse-Probe geschnitten
SettingsActivity
. Ich muss all diese zu vielen Codes kopieren, um zu zeigen, wie diese Android-Entwickler sich perfekt für einen allgemeineren und stabileren Codierungsstil entscheiden.Ich habe die Codes für die Anpassung an das
PreferenceActivity
Tablet und eine größere API hinterlassen .xml/pref_general.xml
values/strings_activity_settings.xml
HINWEIS: Eigentlich möchte ich nur kommentieren wie "Googles Beispiel für PreferenceActivity ist auch interessant". Aber ich habe nicht genug Reputationspunkte. Also bitte beschuldigen Sie mich nicht.
(Entschuldige mein schlechtes Englisch)
quelle
Sie müssen die Funktion bindPreferenceSummaryToValue für die onCreate-Methode verwenden.
Beispiel:
Siehe Lektion 3 zum Udacity Android-Kurs: https://www.udacity.com/course/viewer#!/c-ud853/l-1474559101/e-1643578599/m-1643578601
quelle
Für EditTextPreference :
Ich bin natürlich zu dieser Lösung gekommen, nur wenn Sie eine bestimmte Edittext-Präferenz benötigen, dies aber mit jeder Präferenz tun können:
............
............
Dann in onResume ();
Im:
quelle
Meine Lösung besteht darin, eine benutzerdefinierte Datei zu erstellen
EditTextPreference
, die in XML wie folgt verwendet wird:<com.example.EditTextPreference android:title="Example Title" />
EditTextPreference.java : -
quelle
ListPreference
Verwenden Sie diesen Code, um die Zusammenfassung von a auf den in einem Dialogfeld ausgewählten Wert festzulegen:und verweisen Sie auf das
yourpackage.ListPreference
Objekt in Ihrerpreferences.xml
Erinnerung, um dort anzugeben, woandroid:defaultValue
dies den Aufruf auslöstonSetInitialValue()
.Wenn Sie möchten, können Sie den Text ändern, bevor Sie die
setSummary()
für Ihre Anwendung geeignete Option aufrufen .quelle
Da ich einen benutzerdefinierten Benutzer verwende
PreferenceDataStore
, kann ich einigen keinen Listener hinzufügen,SharedPreference
daher musste ich eine etwas hackige Lösung schreiben, die auf jede Einstellung hört:quelle
Wenn Sie AndroidX verwenden, können Sie eine benutzerdefinierte verwenden
SummaryProvider
. Dieser Ansatz kann für jeden verwendet werdenPreference
.Beispiel aus der Dokumentation (Java):
Beispiel aus der Dokumentation (Kotlin):
quelle