Einstellungen organisieren Teil von Android Jetpack

Große und komplexe Einstellungsbildschirme erschweren es Nutzern, eine bestimmte Einstellung zu finden, die sie ändern möchten. Mit der Einstellungsbibliothek haben Sie folgende Möglichkeiten, Ihre Einstellungsbildschirme besser zu organisieren.

Einstellungskategorien

Wenn sich mehrere zusammengehörige Preference-Objekte auf einem Bildschirm befinden, können Sie sie mit einem PreferenceCategory gruppieren. Ein PreferenceCategory zeigt einen Kategorietitel an und trennt die Kategorie visuell.

Wenn Sie ein PreferenceCategory in XML definieren möchten, umschließen Sie die Preference-Tags so mit einem PreferenceCategory:

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <PreferenceCategory
        app:key="notifications_category"
        app:title="Notifications">

        <SwitchPreferenceCompat
            app:key="notifications"
            app:title="Enable message notifications"/>

    </PreferenceCategory>

    <PreferenceCategory
        app:key="help_category"
        app:title="Help">

        <Preference
            app:key="feedback"
            app:summary="Report technical issues or suggest new features"
            app:title="Send feedback"/>

    </PreferenceCategory>

</PreferenceScreen>

Das Ergebnis sieht so aus:

Ein Bild, auf dem Einstellungen mit Kategorien zu sehen sind
Abbildung 1: Einstellungen innerhalb von Kategorien.

Hierarchie in mehrere Bildschirme aufteilen

Wenn Sie eine große Anzahl von Preference-Objekten oder unterschiedlichen Kategorien haben, können Sie sie auf separaten Bildschirmen anzeigen. Jeder Bildschirm ist ein PreferenceFragmentCompat mit eigener Hierarchie. Preference-Objekte auf dem Startbildschirm können dann mit Subbildschirmen verknüpft werden, die ähnliche Einstellungen enthalten.

Abbildung 2 zeigt eine einfache Hierarchie, die zwei Kategorien umfasst: Nachrichten und Synchronisierung.

Ein Bild, das einen Einstellungsbildschirm mit Hierarchien zeigt
Abbildung 2. Eine einfache Hierarchie mit zwei Kategorien.

Abbildung 3 zeigt dieselben Einstellungen, aufgeteilt auf mehrere Bildschirme:

Ein Bild, das eine Hierarchie, die in mehrere Bildschirme aufgeteilt ist
Abbildung 3: Eine Hierarchie, die in mehrere Bildschirme aufgeteilt ist.

Wenn du Bildschirme mit einem Preference verknüpfen möchtest, kannst du app:fragment in XML deklarieren oder Preference.setFragment() verwenden. Starte den vollständigen Paketnamen von PreferenceFragmentCompat, wenn auf Preference getippt wird, wie im folgenden Beispiel gezeigt:

<Preference
        app:fragment="com.example.SyncFragment"
        .../>

Wenn ein Nutzer auf ein Preference mit einem verknüpften Fragment tippt, wird die Schnittstellenmethode PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment() aufgerufen. Bei dieser Methode wird der neue Bildschirm angezeigt und er wird in der umgebenden Activity implementiert.

Eine typische Implementierung sieht in etwa so aus:

Kotlin

class MyActivity : AppCompatActivity(),
    PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    ...
    override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean {
        // Instantiate the new Fragment.
        val args = pref.extras
        val fragment = supportFragmentManager.fragmentFactory.instantiate(
                classLoader,
                pref.fragment)
        fragment.arguments = args
        fragment.setTargetFragment(caller, 0)
        // Replace the existing Fragment with the new Fragment.
        supportFragmentManager.beginTransaction()
                .replace(R.id.settings_container, fragment)
                .addToBackStack(null)
                .commit()
        return true
    }
}

Java

public class MyActivity extends AppCompatActivity implements
        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    ...
    @Override
    public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
        // Instantiate the new Fragment.
        final Bundle args = pref.getExtras();
        final Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate(
                getClassLoader(),
                pref.getFragment());
        fragment.setArguments(args);
        fragment.setTargetFragment(caller, 0);
        // Replace the existing Fragment with the new Fragment.
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.settings_container, fragment)
                .addToBackStack(null)
                .commit();
        return true;
    }
}

Präferenzbildschirme

Die Deklaration verschachtelter Hierarchien innerhalb derselben XML-Ressource mit einem verschachtelten &lt;PreferenceScreen&gt; wird nicht mehr unterstützt. Verwenden Sie stattdessen verschachtelte Fragment-Objekte.

Separate Aktivitäten verwenden

Wenn Sie jeden Bildschirm stark anpassen oder vollständige Activity-Übergänge zwischen Bildschirmen wünschen, können Sie eine separate Activity für jede PreferenceFragmentCompat verwenden. Dadurch können Sie jede Activity und den entsprechenden Einstellungsbildschirm vollständig anpassen. Für die meisten Apps empfehlen wir dies nicht. Verwenden Sie stattdessen Fragments wie zuvor beschrieben.

Weitere Informationen zum Starten eines Activity aus einem Preference finden Sie unter Voreinstellungen.