La configuración del automóvil ( packages/apps/Car/Settings
) se proporciona específicamente para el sistema operativo Android Automotive (AAOS). La configuración del automóvil difiere de la configuración del teléfono ( packages/apps/Settings
). Si bien Car Settings contiene algunas configuraciones familiares del teléfono, Car Settings proporciona una interfaz de usuario visual adaptada al automóvil , optimizaciones de distracción del conductor y numerosos puntos de entrada de personalización para OEM.
Además de la descripción general de la configuración del automóvil que se proporciona a continuación, consulte estos temas relacionados para obtener más información sobre la configuración del automóvil:
- Agregar configuraciones de automóvil
- Reorganizar la configuración del coche
- Optimización de la distracción en la configuración del automóvil
- Indexación de búsqueda de configuración del vehículo
- Personalización de doble panel
Arquitectura y directrices
La mayoría de las páginas en Car Settings 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 . Si bien existen algunas excepciones a esta regla, como algunos fragmentos especiales que extienden BaseFragment en lugar de SettingsFragment
y algunas actividades que residen fuera de CarSettingActivities , todos los cuales deben considerarse excepciones (no patrones a seguir).
Preferencias estáticas
Una preferencia estática se define en XML mediante la etiqueta Preference o CarUiPreference . Una implementación SettingsFragment
utiliza el método getPreferenceScreenResId()
para definir qué archivo XML contiene la lista estática de preferencias para mostrar.
Preferencias dinámicas
Las preferencias dinámicas utilizan la etiqueta PreferenceGroup o una implementación de PreferenceGroup.
Dentro de la aplicación CarSettings, las preferencias dinámicas representan un conjunto normal de preferencias que dirigen al usuario a páginas adicionales dentro de CarSettings, pero que se agregaron a través del Controlador de preferencias en lugar de en XML. Un ejemplo es la preferencia Administrar teclados en la preferencia Idiomas y entrada, que agrega dinámicamente métodos de entrada a la página de preferencias en función de si estos métodos de entrada están permitidos o no.
Barras de acción
La parte superior de cada pantalla de configuración tiene una barra de acciones, que puede contener una navegación "atrás", un título de pantalla y widgets de acciones suplementarias (por ejemplo, botones e interruptores). Estas barras de acción son similares a la ActionBar proporcionada por Android, pero en realidad son vistas personalizadas. En Android 11 y versiones posteriores, esta barra de herramientas se incluye en el diseño base del chasis, que contiene las vistas de la barra de herramientas y un diseño de marco para el resto del contenido de la aplicación.
Los widgets de acción suplementarios son clases MenuItem y deben crearse en onCreate
del respectivo SettingsFragment
o BaseFragment
. Las propiedades como la visibilidad, el estado, etc. deben ser controladas por configuradores 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 acción son compatibles con la optimización de la distracción en la configuración del automóvil . Establezca las UXRestrictions en MenuItem.Builder
en el momento de la creación.
Controladores de preferencias
Cada página de configuración puede contener varias Preferencias diferentes.
Vea la siguiente imagen para ver cómo se relacionan estos componentes:
Figura 1. Componentes de CarSettings
PreferenceController
es un componente consciente del ciclo de vida que ayuda a encapsular la lógica empresarial relacionada con Preferencias específicas. PreferenceControllers
solo se pueden 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>
Car Settings impide explícitamente la creación de PreferenceController
a través del código para facilitar la modificación de la jerarquía de Configuración con cambios mínimos en el código Java.
Es posible que un PreferenceController
necesite algunos datos dinámicos para funcionar correctamente. Por ejemplo, un PreferenceController
que desactiva las notificaciones de una aplicación necesita saber en qué aplicación actuar. Debido a que PreferenceControllers
siempre se definen en XML, no hay forma de proporcionar argumentos de constructor adicionales. En cambio, estos valores adicionales se proporcionan a través de configuradores públicos en PreferenceController
y se configuran mediante el método 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 a menudo se utiliza el método use(...)
, más difícil resulta mantener el objetivo original de poder reorganizar la jerarquía de configuración con cambios mínimos en el código Java, porque es necesario eliminar grandes secciones del código fragmentado existente. copiado en el fragmento recién creado. Una forma de minimizar la dificultad de hacer esto es:
- Minimiza el uso de
use(...)
. - Intente mantener cada llamada a
use(...)
en un lugar del fragmento (por ejemplo, en el métodoonAttach()
).
Manejo de intenciones
Todas las intenciones que debe manejar la aplicación Configuración del automóvil se definen en el archivo de manifiesto . Las intenciones generalmente se definen y manejan como la mayoría de las aplicaciones estándar de Android, con todas las actividades y filtros de intenciones definidos en el manifiesto.
Cambiar el fragmento raíz
Si lo desea, el ícono Salir se puede mostrar u ocultar usando config_show_settings_root_exit_icon
.
Personaliza el tema
Personaliza otros atributos y recursos
La aplicación Car Settings utiliza principalmente CarSettingTheme
, que es una extensión de Theme.CarUi
. Este tema se utiliza para estandarizar la apariencia de las aplicaciones del sistema para garantizar la coherencia del sistema.
Personalizar preferencias
La personalización de preferencias abarca estas ubicaciones adicionales:
- El diseño de algunas clases de preferencia base se define en
car_preference
y se superpone para las construcciones de automóviles. Cualquier diseño de personalización para las clases de preferencia base se puede reemplazar aquí. - La configuración del automóvil utiliza algunas preferencias personalizadas definidas principalmente en el paquete
common
. Estos deben superponerse dentro del módulo Configuración del automóvil por separado de las clases de preferencia base.