Zeigen Sie den Wert der EditTextPreference in der Zusammenfassung
Ich bin, zu lernen, wie zu entwickeln, in der Android und wollen eine Einstellung der Tätigkeit,
Meine Einstellung Aktivität
public class Main extends Activity {
protected SettingsFragment settingsFragment;
@SuppressLint("NewApi")
@TargetApi(11)
public class SettingsFragment extends PreferenceFragment implements
SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
setSummaries();
}
@Override
public void onResume() {
final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ;
super.onResume();
sh.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ;
super.onPause();
sh.unregisterOnSharedPreferenceChangeListener(this);
}
@SuppressLint("NewApi")
public void setSummaries(){
final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ;
//Pref1
Preference stylePref = findPreference("editTextPref");
stylePref.setSummary(sh.getString("editTextPref", ""));
//here the other preferences..
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("editTextPref")) {
Preference pref = settingsFragment.findPreference(key);
//Set summary to be the user-description for the selected value
pref.setSummary(sharedPreferences.getString(key, ""));
}
//here the others preferences
}
}//End fragment
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
settingsFragment = new SettingsFragment();
getFragmentManager().beginTransaction()
.replace(android.R.id.content, settingsFragment)
.commit();
}
}
und meine res/preferences.xml
Datei
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="BTA"
xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference
android:key="editTextPref"
android:title="Numero de telephone"
android:summary="This allows you to enter a string"
android:defaultValue="*"/>
</PreferenceCategory>
</PreferenceScreen>
So, jetzt habe ich die Tätigkeit für die Einstellung der Aktivität. Aber ich möchte, um den Wert anzuzeigen, der EditTextPref in android:summary
.
Ich habe gefunden, dass viele Themen, aber alle Funktionen veraltet.
EDIT : Dank @Ace_McIntosh , bearbeitete ich meinen code für Menschen, die es wollen, es funktioniert jetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie einfach die setSummary Methode auf die gewünschte Präferenz-Objekt. Rufen Sie nach der Wiederaufnahme Ihrer Einstellungen fragment für jeden Eintrag, den Sie aktualisieren möchten (D. H., alle
EditTextPreference
Einträge in Ihrem Fall) und registrieren Sie einOnSharedPreferenceChangeListener
auf die konkreteSharedPreferences
Objekt (so dass Sie aktualisieren können, die Zusammenfassung, falls es geändert wird) – und übergeben Sie es in die gewünschte EditTextPreference Wert (die Sie erhalten können, über seinegetText()
- Methode).Implementieren es in Ihre
MyPreferenceFragment
wie dieses (habe ich nicht garantieren, dass es rechts von der Fledermaus, es dient nur Ihnen eine Idee geben):PreferenceActivity
Klasse, Sie rufen es in derPreferenceFragment
Klasse (wo es ist nicht veraltet, wie Sie sehen können in der Dokumentation). Werden Sie sicher, dass nutzen-fragment (Sie haben nicht geschrieben, den code habe ich nur sehen, dass Sie eine neue Instanz erstellenMyPreferenceFragment
in der activity-Klasse). Beachten Sie auch, dass die übergeordnete Aktivität einesPreferenceFragment
nicht zu verlängernPreferenceActivity
, es ist nur eine gewöhnliche Aktivität.setPreferenceScreen(null); addPreferencesFromResource(R.xml.preferences);
, aber ich finde nicht wo ich es hinzufügen.registerOnSharedPreferenceChangeListener
Methode IhrerSharedPreferences
Objekt und behandeln Sie das update in den Hörer. Es ist ein Beispiel, wie dies in der code, den ich gepostet Sie, sagte der listener die KlasseMyPreferenceFragment
selbst (es hat zur Umsetzung der entsprechenden Schnittstelle) und wie Sie sehen können, enthält es dieonSharedPreferenceChanged
Rückruf, wo Sie sollten aktualisieren Sie die Zusammenfassung der Einstellung, die geändert wird. Wenn Sie dies tun, wird die übersicht wird aktualisiert, jedes mal, wenn Sie den Wert einer Einstellung ändert.setSummaries()
Methode, und wie?onResume()
lifecycle-Methode, weil Sie es brauchen, jedesmal aufgerufen, wenn das fragment kommt in den Vordergrund. Ich empfehle, dass Sie sich vorstellen, Ihresh
variable als Feld Klasse und in IhremonResume()
Sie nennen das:sh.registerOnSharedPreferenceChangeListener(Main.this)
. Und vergessen Sie auch nicht, um die Registrierung der callback in deronPause()
Methode, mitsh.unregisterOnSharedPreferenceChangeListener(Main.this)
(wenn Sie dies nicht tun, bekommen Sie vielleicht eine null-Zeiger-Ausnahme aus, wenn der Verzicht und der Rückkehr in die Einstellungen-fragment und die Berufung auf den Hörer).SettingsFragment
instanziierbaren Klasse, nicht statisch, sonst würden Sie nicht in der Lage sein, um Zugriff auf das parent-Objekt. Um die Dinge noch bequemer, ich würde jedoch empfehlen, dass du die parent-activity-Klasse und sauber machen, das fragment Umsetzung derSharedPreferences.OnSharedPreferenceChangeListener
statt – auf diese Weise würden Sie in der Lage sein, um die Wiederverwendung IhrerSharedPreferences
- class-Feld (nachdem es eingeführt ist, vorausgesetzt, dass Sie werden).sh
variable in class-Feld" – die gleiche Weise, wie Sie sehen, diesharedPreferences
variable in den code, den ich gepostet hat, dann genügt es, weisen Sie den Wert nur einmal (siehe dieonResume
Methode in meinem Beispiel konkret diesharedPreferences = getPreferenceManager().getSharedPreferences()
, wo die variable erhält den Wert und wiederverwendet werden, während die Klasse [mir ist gerade aufgefallen, dass es eigentlich nicht wiederverwendet in der onPause-Methode, so bearbeitete ich es]). Es hat keine Auswirkungen auf die Funktionalität, aber es ist ein effizienter code.Einfach überschreiben
getSummary
vonEditTextPreference
, dann erhalten Sie eine EditTextPreference mit seinem Wert angezeigt, als Zusammenfassung.(In Kotlin) ich würde lieber etwas tun, ein wenig mehr einfach und einfach erstellen Sie eine Klasse, die erweitert die EditTextPreference:
Anschließend können Sie diese wie folgt:
<
<Ihrem Paket-Namen>.SummarisedEditTextPreference/>
Es gibt einige bugs in dem Beispiel oben gepostet, also ich dachte, ich poste eine funktionierende Lösung (unterstützt ListPreference und MultiSelectListPreference auch)
In androidx Bibliothek, EditTextPreference hat app:useSimpleSummaryProvider Attribut. Mit dem Attribut, das Sie nicht brauchen, um erweitern einer Klasse oder hören Sie die änderungen auf SharedPreferences. Sie können den Beispielcode an https://github.com/googlesamples/android-preferences/blob/master/app/src/main/res/xml/dialogs.xml
app:useSimpleSummaryProvider="true"
und es wurde Hinzugefügt, Vorlieben:1.1.0-alpha01Antwort von @serv-inc für mich gearbeitet. Irgendwie andere Antworten funktionierte nur, wenn der Wert geändert wird.
Aber bevor es funktionierte, musste ich eine änderung vornehmen, wie unten:
Zeigt es den Wert, wenn es anfänglich angezeigt wird, wenn der Wert ändert, sowie nach fortsetzen.
Gebäude auf Brett Cherringtons Antwort, die die Umsetzung in Kotlin. Es war ein Fehler, nämlich, dass PreferenceCategories wurden nicht unterstützt, die ist fest mit einer zusätzlichen rekursiven Schleife in setSummary
Zusätzlich zu @Eke Koseoglu Antwort.
Wenn Sie AndroidX Vorliebe Bibliothek, können Sie summaryProvider von Kotlin-code unten.
Gemäß der Dokumentation von EditTextPreference.SimpleSummaryProvider;