Einstellungen anpassen Teil von Android Jetpack
In diesem Dokument wird beschrieben, wie Sie Preference
-Objekte in Ihrer Hierarchie anpassen können.
Einstellungen aufrufen
Verwenden Sie PreferenceFragmentCompat.findPreference()
, um auf ein einzelnes Preference
zuzugreifen, z. B. beim Abrufen oder Festlegen eines Preference
-Werts.
Diese Methode sucht in der gesamten Hierarchie nach einem Preference
mit dem angegebenen Schlüssel.
So greifen Sie beispielsweise auf ein EditTextPreference
mit dem Schlüssel "signature"
zu:
<EditTextPreference app:key="signature" app:title="Your signature"/>
Rufen Sie diese Preference
mithilfe des folgenden Codes ab:
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) val signaturePreference: EditTextPreference? = findPreference("signature") // Do something with this preference. }
Java
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); EditTextPreference signaturePreference = findPreference("signature"); // Do something with this preference. }
Sichtbarkeit der Einstellungen steuern
Sie können festlegen, welche Preference
-Objekte für Nutzer sichtbar sind, wenn sie einen Einstellungsbildschirm aufrufen. Wenn beispielsweise eine bestimmte Preference
nur dann aussagekräftig ist, wenn eine entsprechende Funktion aktiviert ist, können Sie diese Preference
ausblenden, wenn das Feature deaktiviert ist.
Damit ein Preference
nur dann angezeigt wird, wenn eine Bedingung erfüllt ist, legen Sie zuerst die Sichtbarkeit Preference
in der XML-Datei auf „false“ fest, wie im folgenden Beispiel gezeigt:
<EditTextPreference app:key="signature" app:title="Your signature" app:isPreferenceVisible="false"/>
Zeigen Sie in onCreatePreferences()
den Preference
an, wenn die entsprechende Bedingung erfüllt ist:
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) if(/*some feature*/) { val signaturePreference: EditTextPreference? = findPreference("signature") signaturePreference?.isVisible = true } }
Java
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); if(/*some feature*/) { EditTextPreference signaturePreference = findPreference("signature"); if (signaturePreference != null) { signaturePreference.setVisible(true); } } }
Zusammenfassungen dynamisch aktualisieren
Bei einem Preference
, das Daten dauerhaft enthält, muss der aktuelle Wert in der Zusammenfassung angezeigt werden, damit der Nutzer den aktuellen Status von Preference
besser nachvollziehen kann. Beispielsweise muss ein EditTextPreference
den gespeicherten Textwert und ein ListPreference
den ausgewählten Listeneintrag anzeigen. Möglicherweise haben Sie auch Preference
-Objekte, die ihre Zusammenfassung basierend auf dem internen oder externen Anwendungsstatus aktualisieren müssen, z. B. ein Preference
, das eine Versionsnummer anzeigt. Dazu können Sie SummaryProvider
verwenden.
SimpleSummaryProvider verwenden
ListPreference
und EditTextPreference
enthalten einfache SummaryProvider
-Implementierungen, bei denen der gespeicherte Preference
-Wert automatisch als Zusammenfassung angezeigt wird. Wenn kein Wert gespeichert ist, wird „Nicht festgelegt“ angezeigt.
Wenn Sie diese Implementierungen über XML aktivieren möchten, legen Sie app:useSimpleSummaryProvider="true"
fest.
Alternativ können Sie im Code ListPreference.SimpleSummaryProvider.getInstance()
und EditTextPreference.SimpleSummaryProvider.getInstance()
verwenden, um die einfache SummaryProvider
-Instanz abzurufen und diese dann auf der Preference
festzulegen, wie im folgenden Beispiel gezeigt:
Kotlin
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance() editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
Java
listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance()); editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
Benutzerdefinierten SummaryProvider verwenden
Sie können eine eigene SummaryProvider
erstellen und provideSummary()
überschreiben, um die Zusammenfassung anzupassen, wenn sie von Preference
angefordert wird. Die folgende EditTextPreference
zeigt beispielsweise die Länge des gespeicherten Werts als Zusammenfassung an:
Nehmen wir beispielsweise folgendes EditTextPreference
-Objekt an:
<EditTextPreference app:key="counting" app:title="Counting preference"/>
In onCreatePreferences()
können Sie eine neue SummaryProvider
erstellen und provideSummary()
überschreiben, um die anzuzeigende Zusammenfassung zurückzugeben:
Kotlin
val countingPreference: EditTextPreference? = findPreference("counting") countingPreference?.summaryProvider = SummaryProvider<EditTextPreference> { preference -> val text = preference.text if (text.isNullOrEmpty()) { "Not set" } else { "Length of saved value: " + text.length } }
Java
EditTextPreference countingPreference = findPreference("counting"); if (countingPreference != null) { countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() { @Override public CharSequence provideSummary(EditTextPreference preference) { String text = preference.getText(); if (TextUtils.isEmpty(text) || text == null){ return "Not set"; } return "Length of saved value: " + text.length(); } }); }
In der Zusammenfassung Preference
wird die Länge des gespeicherten Werts angezeigt oder „Nicht festgelegt“, wenn kein gespeicherter Wert vorhanden ist.
Dialogfeld „EditText preference“ anpassen
In einem EditTextPreference
-Dialogfeld können Sie das Verhalten von Textfeldern durch Anhängen einer OnBindEditTextListener
anpassen.
Dieser Listener wird aufgerufen, wenn dem Nutzer das Dialogfeld angezeigt wird.
Beispielsweise können Sie ein Dialogfeld so anpassen, dass nur Zahlen akzeptiert werden. Erstellen Sie zuerst den EditTextPreference
:
<EditTextPreference app:key="number" app:title="Numbers only preference"/>
Erstellen Sie als Nächstes in onCreatePreferences()
eine neue OnBindEditTextListener
und überschreiben Sie onBindEditText()
, um EditText
anzupassen, wenn sie dem Nutzer angezeigt wird.
Kotlin
val numberPreference: EditTextPreference? = findPreference("number") numberPreference?.setOnBindEditTextListener { editText -> editText.inputType = InputType.TYPE_CLASS_NUMBER }
Java
EditTextPreference numberPreference = findPreference("number"); if (numberPreference != null) { numberPreference.setOnBindEditTextListener( new EditTextPreference.OnBindEditTextListener() { @Override public void onBindEditText(@NonNull EditText editText) { editText.setInputType(InputType.TYPE_CLASS_NUMBER); } }); }
Wenn das Dialogfeld jetzt für den Nutzer angezeigt wird, wird die Tastatur im numerischen Modus geöffnet, sodass der Nutzer in EditText
nur Zahlen eingeben kann.
Aktion für Einstellungen
Auf Preference
kann beim Antippen eine bestimmte Aktion ausgeführt werden. Ein Preference
kann beispielsweise als Link zu einem separaten Teil Ihrer App dienen. Wenn Sie einer Preference
eine Aktion hinzufügen möchten, können Sie direkt eine Intent
für die Preference
festlegen oder eine OnPreferenceClickListener
für eine spezifischere Logik festlegen.
Intent festlegen
Sie können ein Intent
für eine Preference
festlegen, um beim Tippen auf Preference
eine neue Fragment
-, Activity
- oder separate App zu starten. Dies entspricht der Verwendung von Context.startActivity()
mit einem bestimmten Intent
.
Du kannst ein Intent
in XML mithilfe eines verschachtelten <intent>
-Tags festlegen. Im folgenden Beispiel wird ein Intent
definiert, der ein Activity
startet:
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"/> </Preference>
Alternativ können Sie setIntent()
direkt auf einer Preference
verwenden:
Kotlin
val intent = Intent(context, ExampleActivity::class.java) activityPreference.setIntent(intent)
Java
Intent intent = new Intent(getContext(), ExampleActivity.class); activityPreference.setIntent(intent);
Mithilfe von XML können Sie auch Extras mit einem Intent
einfügen:
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"> <extra android:name="example_key" android:value="example_value"/> </intent> </Preference>
Hier ist ein Beispiel für ein Preference
mit einem Intent
, das eine Webseite startet:
<Preference app:key="webpage" app:title="View webpage"> <intent android:action="android.intent.action.VIEW" android:data="http://www.google.com" /> </Preference>
Kotlin
val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse("http://www.google.com") val webpagePreference = findPreference("webpage") webpagePreference?.intent = intent
Java
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.google.com")); webpagePreference.setIntent(intent);
OnPreferredClickListener
Sie können ein OnPreferenceClickListener
für ein Preference
festlegen, das einen Callback zu onPreferenceClick()
hinzufügt, wenn auf Preference
getippt wird. Sie können den Listener beispielsweise verwenden, um zu einem anderen Fragment
oder Activity
zu wechseln, wenn Sie eine komplexere Logik für die Navigation haben.
Verwenden Sie zum Festlegen eines OnPreferenceClickListener
Code ähnlich dem folgenden:
Kotlin
onClickPreference.setOnPreferenceClickListener({ // Do something. true })
Java
onClickPreference.setOnPreferenceClickListener(preference -> { // Do something. return true; });