Организация настроек Часть 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>
Результат будет выглядеть следующим образом:
Разделите иерархию на несколько экранов
Если у вас много объектов типа Preference или отдельных категорий, вы можете показывать их на разных экранах. Каждый экран – это PreferenceFragmentCompat со своей иерархией. Объекты Preference на начальном экране могут ссылаться на дополнительные экраны, содержащие связанные настройки.
На рисунке 2 показана простая иерархия, содержащая две категории: Messages и Sync.
На рисунке 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-ресурсе с помощью вложенного элемента <PreferenceScreen> больше не поддерживается. Вместо этого используйте вложенные объекты Fragment.
Используйте отдельные действия
Если же вам нужно настроить каждый экран по отдельности или вы хотите, чтобы переходы между экранами выполнялись с помощью Activity, используйте отдельный класс Activity для каждого класса PreferenceFragmentCompat. Это позволит вам полностью настроить каждый объект Activity и соответствующий ему экран настроек. Для большинства приложений мы не рекомендуем использовать этот метод. Вместо него используйте метод Fragments, как описано выше.
Подробнее о том, как запустить Activity из Preference, рассказывается в статье Действия с настройками.