La Configuración del vehículo (packages/apps/Car/Settings
) se proporciona específicamente para lo siguiente:
SO Android Automotive (AAOS) La configuración del vehículo es diferente de la del teléfono
(packages/apps/Settings
). Si bien la configuración del vehículo incluye algunos parámetros de configuración del teléfono,
La Configuración del vehículo proporciona una interfaz de usuario visual con vehículos, optimizaciones de distracción del conductor
y numerosos puntos de entrada para la personalización para OEM.
Además de la descripción general de la Configuración del vehículo que se muestra a continuación, consulta estas secciones temas para obtener más información sobre la Configuración del vehículo:
- Cómo agregar parámetros de configuración del vehículo
- Cómo reorganizar la configuración del vehículo
- Optimización de distracciones en la configuración del vehículo
- Indexación de la Búsqueda de la configuración del vehículo
- Personalización del panel dual
Arquitectura y lineamientos
La mayoría de las páginas de la Configuración del vehículo se implementan como una serie de fragmentos.
que extienden SettingsFragment, cada uno con su propia actividad definida en
CarSettingActivities. Estas actividades estáticas se extienden desde BaseCarSettingsActivity. Esta regla tiene algunas excepciones, como algunos fragmentos especiales que se extienden
BaseFragment en lugar de SettingsFragment
y algunas Actividades que residen fuera de CarSettingActivities, todas las cuales deben considerarse como excepciones (no como patrones a seguir).
Preferencias estáticas
Se define una preferencia estática en XML usando el parámetro Preference.
o CarUiPreference
etiqueta. Una implementación de SettingsFragment
usa getPreferenceScreenResId()
.
para definir qué archivo en formato XML contiene la lista estática de preferencias que se mostrarán.
Preferencias dinámicas
Las preferencias dinámicas usan PreferenceGroup. o una implementación de PreferenceGroup.
Dentro de la app de CarSettings, las preferencias dinámicas representan preferencias que dirigen al usuario a páginas adicionales en CarSettings, pero que se agregaron mediante la pestaña Preferencias Controller en lugar de en el XML. Un ejemplo es Administrar teclados en Idiomas y Preferencia de entrada que agrega entradas de forma dinámica a la página de preferencias en función de si estos métodos de entrada está permitido o no.
Barras de acción
La parte superior de cada pantalla de configuración tiene una barra de acciones, que puede contener una “atrás” navegación, un título de pantalla y widgets de acción complementarios (por ejemplo, interruptores y botones). Estas barras de acciones son similares a la ActionBar. que proporciona Android, pero que en realidad son vistas personalizadas. En Android 11 y versiones posteriores, este la barra de herramientas se incluye en el diseño de la base del chasis, que contiene las vistas para la barra de herramientas y un diseño de marco para el resto del contenido de la aplicación.
Los widgets de acción complementarios son clases MenuItem y deben crearse en
el onCreate
de las respectivas SettingsFragment
o
BaseFragment
Las propiedades como visibilidad, estado, etc. deben
ser controlados por métodos set en la lógica empresarial de 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); } }
Las barras de acciones admiten
Optimización de distracción en la configuración del vehículo.
Establece las UXRestricciones en MenuItem.Builder
durante la creación.
Controladores de Preference
Cada página de configuración puede contener varias Preferencias.
Consulta la siguiente imagen para saber cómo se relacionan estos componentes:
Figura 1: Componentes de CarSettings
PreferenceController
es un componente optimizado para ciclos de vida que ayuda a
encapsula la lógica empresarial relacionada con preferencias específicas.
PreferenceControllers
solo se puede adjuntar a la preferencia relevante a través de
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>
La configuración del vehículo impide explícitamente la creación de PreferenceController
.
a través del código para facilitar la modificación de la jerarquía de las configuraciones con un mínimo
cambios en el código Java.
Es posible que un PreferenceController
necesite datos dinámicos
para funcionar correctamente. Por ejemplo, un PreferenceController
que apaga
las notificaciones de una aplicación deben saber sobre qué aplicación debe actuar.
Debido a que los PreferenceControllers
siempre se definen en XML, no hay
para proporcionar argumentos de constructor adicionales. En cambio, estos valores adicionales se
que se proporcionan con métodos set públicos en PreferenceController
y que se configuran con
use(...)
de 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); } }
Cuanto más seguido se use el método use(...)
, más difícil será mantener
el objetivo original de poder reorganizar la jerarquía de la configuración con cambios mínimos en
código Java, ya que grandes secciones del código de fragmento existente deben copiarse en
el fragmento recién creado. Una forma de minimizar la dificultad de hacer esto es:
- Minimiza el uso de
use(...)
. - Intenta mantener todas las llamadas a
use(...)
en un solo lugar del fragmento (por ejemplo, en el métodoonAttach()
).
Control de intents
Todos los intents que debe controlar la app de Configuración del vehículo se definen en el manifiesto . Generalmente, los intents se definen y manejan como la mayoría de las apps para Android estándar, con todas las actividades y los filtros de intents definidos en el manifiesto.
Cómo cambiar el fragmento raíz
Si lo deseas, el ícono de salida se puede ocultar o mostrar con config_show_settings_root_exit_icon
.
Cómo personalizar el tema
Personaliza otros atributos y recursos
La app de Configuración del vehículo usa principalmente CarSettingTheme
,
que es una extensión de Theme.CarUi
. Este tema se usa para estandarizar la
de las apps del sistema para garantizar
la coherencia en el sistema.
Personalizar preferencias
La personalización de las preferencias abarca estas ubicaciones adicionales:
- El diseño de algunas clases de preferencias básicas se define en
car_preference
. y superpuestos para la fabricación de automóviles. Cualquier diseño de personalización para las clases de preferencias básicas se reemplaza aquí. - La Configuración del vehículo usa algunas preferencias personalizadas definidas principalmente en la
common
. Estas deben superponerse en el módulo de Configuración del automóvil de forma independiente de las clases de preferencias básicas.