Настройки автомобиля ( packages/apps/Car/Settings
) предоставляются специально для Android Automotive OS (AAOS). Настройки автомобиля отличаются от настроек телефона ( packages/apps/Settings
). В то время как Car Settings содержит некоторые знакомые настройки телефона, Car Settings предоставляет автомобильный визуальный пользовательский интерфейс, оптимизацию отвлечения внимания водителя и многочисленные точки входа для настройки для OEM-производителей.
В дополнение к представленному ниже обзору настроек автомобиля см. следующие связанные темы, чтобы узнать больше о настройках автомобиля:
- Добавление настроек автомобиля
- Изменение настроек автомобиля
- Оптимизация отвлечения внимания в настройках автомобиля
- Индексация поиска настроек автомобиля
- Настройка двойной панели
Архитектура и рекомендации
Большинство страниц в Car Settings реализованы в виде серии фрагментов, которые расширяют SettingsFragment , каждый из которых имеет свою собственную активность, определенную в CarSettingActivities . Эти статические действия расширены из BaseCarSettingsActivity . Хотя есть несколько исключений из этого правила, например, некоторые специальные фрагменты, расширяющие BaseFragment , а не SettingsFragment
, и некоторые Activity, находящиеся вне CarSettingActivities , все из которых следует рассматривать как исключения (а не как шаблоны для подражания).
Статические настройки
Статическое предпочтение определяется в XML с помощью тега Preference или CarUiPreference . Реализация SettingsFragment
использует метод getPreferenceScreenResId()
, чтобы определить, какой файл XML содержит статический список настроек для отображения.
Динамические настройки
Динамические предпочтения используют тег PreferenceGroup > или реализацию PreferenceGroup, такую как LogicalPreferenceGroup , для определения набора предпочтений, которые генерируются и управляются контроллерами предпочтений .
В приложении CarSettings динамические предпочтения представляют собой обычный набор предпочтений, которые направляют пользователя на дополнительные страницы в CarSettings, но которые были добавлены через контроллер предпочтений , а не в XML. Примером может служить настройка «Управление клавиатурами» в разделе «Языки и ввод», которая динамически добавляет методы ввода на страницу настроек в зависимости от того, разрешены ли эти методы ввода или нет.
Панели действий
В верхней части каждого экрана настроек есть панель действий, которая может содержать навигацию «назад», заголовок экрана и виджеты дополнительных действий (например, кнопки и переключатели). Эти панели действий похожи напанель действий, предоставляемую Android, но на самом деле представляют собой настраиваемые представления. В Android 11 и более поздних версиях эта панель инструментов включена в базовую компоновку корпуса, которая содержит представления для панели инструментов и компоновку фрейма для остального содержимого приложения.
Виджеты дополнительных действий являются классами MenuItem и должны создаваться в onCreate
соответствующего SettingsFragment
или BaseFragment
. Такие свойства, как видимость, состояние и т. д., должны контролироваться сеттерами в бизнес-логике SettingsFragment
.
// ExampleSettingsFragment.java public class ExampleSettingsFragment extends SettingsFragment { @Override protected List<MenuItem> getToolbarMenuItems() { return Collections.singletonList(mClearConfirmButton); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mButton = new MenuItem.Builder(getContext()) .setTitle(R.string.text) .setOnClickListener(mOnClickListener) .setUxRestrictions(CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP) .build(); } private void updateState() { button.setVisible(false); } }
Панели действий поставляются с поддержкой оптимизации отвлечения внимания в настройках автомобиля . Установите UXRestrictions в MenuItem.Builder
при создании.
Контроллеры предпочтений
Каждая страница настроек может содержать ряд различных настроек . Чтобы поддерживать организацию кода, с каждым параметром или связанной группой параметров связан PreferenceController .
На следующем изображении показано, как связаны эти компоненты:
Рисунок 1. Компоненты CarSettings
PreferenceController
— это компонент с учетом жизненного цикла, который помогает инкапсулировать бизнес-логику, относящуюся к конкретным предпочтениям. PreferenceControllers
могут быть присоединены к соответствующему предпочтению только через XML.
// example_settings_fragment.xml <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/example_settings_title"> <Preference android:key="@string/pk_example_preference_key" android:title="@string/example_preference_title" settings:controller="com.android.car.settings.example.ExamplePreferenceController"/> </PreferenceScreen>
Настройки автомобиля явно предотвращают создание PreferenceController
с помощью кода, чтобы упростить изменение иерархии настроек с минимальными изменениями в коде Java.
Возможно, PreferenceController
нуждается в некоторых динамических данных для правильной работы. Например, PreferenceController
, который отключает уведомления для приложения, должен знать, с каким приложением действовать. Поскольку PreferenceControllers
всегда определяются в XML, нет возможности предоставить дополнительные аргументы конструктора. Вместо этого эти дополнительные значения предоставляются через общедоступные установщики в PreferenceController
и устанавливаются с помощью метода use(...)
из SettingsFragment
.
// ExamplePreferenceController.java public class ExamplePreferenceContorller extends PreferenceController<Preference> { private ExampleArg mExampleArg; public ExamplePreferenceController(...) { ... } public void setExampleArg(ExampleArg exampleArg) { mExampleArg = exampleArg; } } // ExampleSettingsFragment.java public class ExampleSettingsFragment extends SettingsFragment { @Override @XmlRes protected int getPreferenceScreenResId() { Return R.xml.example_settings_fragment; } @Override public void onAttach(Context context) { ExampleArg arg = (ExampleArg) getArguments().getSerializeable(ARG_KEY); ExamplePreferenceController controller = use(ExamplePreferenceController.class, R.string.pk_example_preference_key); controller.setExampleArg(arg); } }
Чем чаще используется метод use(...)
, тем сложнее становится сохранить первоначальную цель — иметь возможность изменить иерархию настроек с минимальными изменениями в коде Java, поскольку большие участки кода существующего фрагмента должны будут скопировать во вновь созданный фрагмент. Один из способов свести к минимуму сложность выполнения этого заключается в следующем:
- Сведите к минимуму использование
use(...)
. - Старайтесь держать каждый вызов
use(...)
в одном месте фрагмента (например, вonAttach()
).
Обработка намерений
Все намерения , которые должны обрабатываться приложением Car Settings, определены в файле манифеста . Намерения обычно определяются и обрабатываются так же, как и большинство стандартных приложений Android, со всеми действиями и фильтрами намерений, определенными в манифесте.
Изменение корневого фрагмента
По умолчанию Car Settings показывает HomepageFragment
при запуске приложения. Его можно настроить как QuickSettingFragment
, инвертировав логические значения для config_is_quick_settings_root
, config_enable_home_settings_icon
и config_enable_quick_settings_icon
.
При желании значок выхода можно отобразить или скрыть с помощью config_show_settings_root_exit_icon
.
Настройка темы
Настройка других атрибутов и ресурсов
Приложение Car Settings в основном использует CarSettingTheme
, которое является расширением Theme.CarUi
. Эта тема используется для стандартизации внешнего вида системных приложений для обеспечения согласованности в системе.
Настройка параметров
Настройка параметров охватывает следующие дополнительные места:
- Компоновка некоторых базовых классов предпочтений определяется в
car_preference
и накладывается для сборок автомобилей. Здесь можно заменить любые макеты настройки для базовых классов предпочтений. - Настройки автомобиля используют некоторые пользовательские настройки, определенные в основном в
common
пакете. Они должны быть наложены в модуле «Настройки автомобиля» отдельно от базовых классов предпочтений.