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:

Ein Bild, das ein Beispiel für „EditText preference“ zeigt
Abbildung 1: Ein Beispiel für EditTextPreference.

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