Организация настроек   Часть Android Jetpack.

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

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

Если на одном экране есть несколько связанных объектов 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 показана простая иерархия, содержащая две категории: Messages и Sync.

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

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

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

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

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

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

Обычно реализация выглядит следующим образом:

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

PreferenceScreens

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

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

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

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