Porządkowanie ustawień Część stanowiąca część Androida Jetpack.

Duże i złożone ekrany ustawień mogą utrudniać użytkownikowi znalezienie określonego ustawienia, które chce zmienić. Biblioteka preferencji oferuje następujące sposoby lepszego porządkowania ekranów ustawień.

Kategorie preferencji

Jeśli na jednym ekranie jest kilka powiązanych obiektów Preference, możesz je zgrupować za pomocą elementu PreferenceCategory. PreferenceCategory wyświetla tytuł kategorii i wizualnie ją oddziela.

Aby zdefiniować PreferenceCategory w pliku XML, umieść tagi Preference w elemencie PreferenceCategory w ten sposób:

<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>

Wynik będzie wyglądał tak:

Grafika przedstawiająca preferencje i kategorie
Rysunek 1. Preferencje w kategoriach.

Dzielenie hierarchii na wiele ekranów

Jeśli masz dużą liczbę obiektów Preference lub różnych kategorii, możesz je wyświetlić na osobnych ekranach. Każdy ekran to obiekt PreferenceFragmentCompat z własną, osobną hierarchią. Obiekty Preference na ekranie początkowym mogą być następnie połączone z ekranami podrzędnymi, które zawierają powiązane ustawienia.

Rysunek 2 przedstawia prostą hierarchię, która obejmuje 2 kategorie: Wiadomości i Synchronizacja.

Obraz przedstawiający ekran ustawień z hierarchiami
Rysunek 2. Prosta hierarchia z 2 kategoriami.

Rysunek 3 przedstawia ten sam zbiór ustawień podzielony na wiele ekranów:

Obraz przedstawiający hierarchię podzieloną na kilka ekranów
Rysunek 3. Hierarchia podzielona na kilka ekranów.

Aby połączyć ekrany za pomocą elementu Preference, możesz zadeklarować app:fragment w pliku XML lub użyć Preference.setFragment(). Po kliknięciu Preference uruchom pełną nazwę pakietu PreferenceFragmentCompat, jak pokazano w tym przykładzie:

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

Gdy użytkownik klika Preference z powiązanym elementem Fragment, wywoływana jest metoda interfejsu PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment(). W tej metodzie wyświetla się nowy ekran i gdzie zostanie on zaimplementowany w otaczającym go obszarze Activity.

Typowa implementacja wygląda mniej więcej tak:

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

Ekrany preferencji

Deklarowanie zagnieżdżonych hierarchii w tym samym zasobie XML za pomocą zagnieżdżonego elementu &lt;PreferenceScreen&gt; nie jest już obsługiwane. Użyj zamiast niej zagnieżdżonych obiektów Fragment.

Użyj osobnych aktywności

Jeśli musisz znacząco dostosować każdy ekran lub chcesz przejść między ekranami w pełnym zakresie Activity, możesz użyć osobnego elementu Activity dla każdego elementu PreferenceFragmentCompat. Dzięki temu możesz w pełni dostosować każdy element Activity i odpowiadający mu ekran ustawień. W przypadku większości aplikacji nie zalecamy tego. Użyj Fragments w sposób opisany powyżej.

Więcej informacji o uruchamianiu Activity z Preference znajdziesz w sekcji Działania dotyczące preferencji.