Организуйте свои настройки . Часть Android Jetpack .

Большие и сложные экраны настроек могут затруднить пользователю поиск конкретной настройки, которую он хочет изменить. Библиотека предпочтений предлагает следующие способы лучшей организации экранов настроек.

Категории предпочтений

Если у вас есть несколько связанных объектов Preference на одном экране, вы можете сгруппировать их с помощью PreferenceCategory . PreferenceCategory отображает заголовок категории и визуально разделяет категорию.

Чтобы определить PreferenceCategory в XML, оберните теги Preference 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>

Результат выглядит следующим образом:

Изображение, показывающее предпочтения с категориями.
Рисунок 1. Предпочтения внутри категорий.

Разделите свою иерархию на несколько экранов

Если у вас есть большое количество объектов Preference или отдельных категорий, вы можете отображать их на отдельных экранах. Каждый экран представляет собой PreferenceFragmentCompat со своей отдельной иерархией. Объекты Preference на начальном экране могут затем ссылаться на подэкраны, содержащие соответствующие предпочтения.

На рис. 2 показана простая иерархия, содержащая две категории: «Сообщения» и «Синхронизация» .

Изображение экрана предпочтений с иерархией.
Рисунок 2. Простая иерархия с двумя категориями.

На рис. 3 показан тот же набор настроек, разделенный на несколько экранов:

Изображение, показывающее иерархию, разделенную на несколько экранов.
Рисунок 3. Иерархия, разделенная на несколько экранов.

Чтобы связать экраны с помощью Preference , вы можете объявить app:fragment в XML или использовать Preference.setFragment() . Запустите полное имя пакета PreferenceFragmentCompat при нажатии Preference , как показано в следующем примере:

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

Когда пользователь касается Preference со связанным Fragment , вызывается метод интерфейса PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment() . В этом методе вы обрабатываете отображение нового экрана и экран реализуется в окружающем Activity .

Типичная реализация выглядит примерно так:

Котлин

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

Ява

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

Экраны предпочтений

Объявление вложенных иерархий в одном ресурсе XML с использованием вложенного тега &lt;PreferenceScreen&gt; больше не поддерживается. Вместо этого используйте вложенные объекты Fragment .

Используйте отдельные действия

В качестве альтернативы, если вам нужно сильно настроить каждый экран или если вам нужны полные переходы Activity между экранами, вы можете использовать отдельное Activity для каждого PreferenceFragmentCompat . Сделав это, вы сможете полностью настроить каждое Activity и соответствующий ему экран настроек. Для большинства приложений мы не рекомендуем этого делать; вместо этого используйте Fragments , как описано ранее.

Дополнительные сведения о запуске Activity из Preference см. в разделе Действия предпочтений .