Обзор

Настройки автомобиля ( packages/apps/Car/Settings ) предоставлены специально для автомобильной ОС Android (AAOS). Настройки автомобиля отличаются от настроек телефона ( packages/apps/Settings ). Хотя «Настройки автомобиля» содержат некоторые знакомые настройки телефона, «Настройки автомобиля» предоставляют адаптированный для автомобилей визуальный пользовательский интерфейс, оптимизацию отвлечения внимания водителя и многочисленные точки входа для настройки для OEM-производителей.

В дополнение к обзору настроек автомобиля, представленному ниже, ознакомьтесь с этими связанными разделами, чтобы узнать больше о настройках автомобиля:

Архитектура и рекомендации

Большинство страниц в Car Settings реализованы как серия фрагментов, расширяющих SettingsFragment , каждый из которых имеет свою собственную активность, определенную в CarSettingActivities . Эти статические действия являются продолжением BaseCarSettingsActivity . Хотя из этого правила есть несколько исключений, например, некоторые специальные фрагменты, расширяющие BaseFragment , а не SettingsFragment , и некоторые действия, находящиеся за пределами CarSettingActivities , все из которых следует рассматривать как исключения (а не как шаблоны, которым нужно следовать).

Статические настройки

Статическое предпочтение определяется в XML с помощью тега Preference или CarUiPreference . Реализация SettingsFragment использует метод getPreferenceScreenResId() чтобы определить, какой XML-файл содержит статический список настроек для отображения.

Динамические настройки

Динамические настройки используют тег PreferenceGroup или реализацию PreferenceGroup.

В приложении CarSettings динамические настройки представляют собой обычный набор настроек, которые направляют пользователя на дополнительные страницы в CarSettings, но которые были добавлены через контроллер предпочтений , а не в XML. Примером может служить настройка «Управление клавиатурами» в разделе «Языки и ввод», которая динамически добавляет методы ввода на страницу настроек в зависимости от того, разрешены ли эти методы ввода или нет.

Панели действий

В верхней части каждого экрана настроек имеется панель действий, которая может содержать навигацию «назад», заголовок экрана и виджеты дополнительных действий (например, кнопки и переключатели). Эти панели действий аналогичны ActionBar , предоставляемому 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 при создании.

Контроллеры предпочтений

Каждая страница настроек может содержать несколько различных настроек .

На следующем изображении показано, как связаны эти компоненты:

Компоненты CarSettings

Рисунок 1. Компоненты CarSettings

PreferenceController — это компонент, учитывающий жизненный цикл, который помогает инкапсулировать бизнес-логику, относящуюся к конкретным настройкам. PreferenceControllers можно прикрепить к соответствующему Preference только через 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() ).

Обработка намерений

Все намерения , которые должны обрабатываться приложением «Настройки автомобиля», определены в файле манифеста . Намерения обычно определяются и обрабатываются так же, как и большинство стандартных приложений Android, при этом все действия и фильтры намерений определяются в манифесте.

Изменить корневой фрагмент

При желании значок выхода можно отобразить или скрыть с помощью config_show_settings_root_exit_icon .

Настройте тему

Настройте другие атрибуты и ресурсы

Приложение Car Settings в основном использует CarSettingTheme , который является расширением Theme.CarUi . Эта тема используется для стандартизации внешнего вида системных приложений и обеспечения согласованности в системе.

Настройка предпочтений

Настройка предпочтений охватывает следующие дополнительные места:

  • Расположение некоторых базовых классов предпочтений определяется в car_preference и накладывается на сборки автомобилей. Здесь можно заменить любые макеты настройки для базовых классов предпочтений.
  • В настройках автомобиля используются некоторые пользовательские настройки, определенные в основном в common пакете. Их следует накладывать в модуле «Настройки автомобиля» отдельно от базовых классов предпочтений.