Организуйте свои настройки . Часть 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>
Результат выглядит следующим образом:
![Изображение, показывающее предпочтения с категориями.](https://developer.android.com/static/develop/ui/views/components/settings/images/settings-preferencecategory.png?authuser=7&hl=ru)
Разделите свою иерархию на несколько экранов
Если у вас есть большое количество объектов Preference
или отдельных категорий, вы можете отображать их на отдельных экранах. Каждый экран представляет собой PreferenceFragmentCompat
со своей отдельной иерархией. Объекты Preference
на начальном экране могут затем ссылаться на подэкраны, содержащие соответствующие предпочтения.
На рис. 2 показана простая иерархия, содержащая две категории: «Сообщения» и «Синхронизация» .
![Изображение экрана предпочтений с иерархией.](https://developer.android.com/static/develop/ui/views/components/settings/images/settings-simplehierarchy.png?authuser=7&hl=ru)
На рис. 3 показан тот же набор настроек, разделенный на несколько экранов:
![Изображение, показывающее иерархию, разделенную на несколько экранов.](https://developer.android.com/static/develop/ui/views/components/settings/images/settings-screens.png?authuser=7&hl=ru)
Чтобы связать экраны с помощью 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 с использованием вложенного тега <PreferenceScreen>
больше не поддерживается. Вместо этого используйте вложенные объекты Fragment
.
Используйте отдельные действия
В качестве альтернативы, если вам нужно сильно настроить каждый экран или если вам нужны полные переходы Activity
между экранами, вы можете использовать отдельное Activity
для каждого PreferenceFragmentCompat
. Сделав это, вы сможете полностью настроить каждое Activity
и соответствующий ему экран настроек. Для большинства приложений мы не рекомендуем это делать; вместо этого используйте Fragments
, как описано ранее.
Дополнительные сведения о запуске Activity
из Preference
см. в разделе Действия предпочтений .