La configuración del automóvil (packages/apps/Car/Settings
) se proporciona específicamente para el SO Android Automotive (AAOS). La configuración del vehículo difiere de la configuración del teléfono (packages/apps/Settings
). Si bien la configuración del vehículo contiene algunos parámetros de configuración familiares del teléfono, proporciona una interfaz de usuario visual adaptada al vehículo, optimizaciones para evitar distracciones del conductor y numerosos puntos de entrada de personalización para los OEMs.
Además de la descripción general de la configuración del vehículo que se proporciona a continuación, consulta estos temas relacionados para obtener más información:
- Cómo agregar la configuración del vehículo
- Cómo reorganizar la configuración del automóvil
- Optimización de distracciones en la configuración de automóviles
- Indexación de la búsqueda de la configuración del automóvil
- 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. Si bien hay algunas excepciones a esta regla, como algunos fragmentos especiales que extienden BaseFragment en lugar de SettingsFragment
y algunas actividades que residen fuera de CarSettingActivities, todas deben considerarse excepciones (no como patrones a seguir).
Preferencias estáticas
Una preferencia estática se define en XML con la etiqueta Preference o CarUiPreference. Una implementación de SettingsFragment
usa el método getPreferenceScreenResId()
para definir qué archivo en formato XML contiene la lista estática de preferencias que se mostrará.
Preferencias dinámicas
Las preferencias dinámicas usan la etiqueta PreferenceGroup o una implementación de PreferenceGroup.
Dentro de la app de 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 el archivo XML. Un ejemplo es la preferencia Administrar teclados en la preferencia Idiomas y entrada, que agrega métodos de entrada de forma dinámica a la página de preferencias según si estos métodos de entrada están permitidos o no.
Barras de acciones
La parte superior de cada pantalla de configuración tiene una barra de acción, que puede contener un botón de navegación "atrás", un título de pantalla y widgets de acción complementarios (por ejemplo, botones y interruptores). Estas barras de acciones son similares a la ActionBar que proporciona 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 app.
Los widgets de acciones complementarias son clases de MenuItem y deben crearse en el onCreate
de la SettingsFragment
o BaseFragment
respectiva. Los seters deben controlar propiedades como la visibilidad, el estado, etcétera, 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 distracciones en la configuración del vehículo.
Establece UXRestrictions en MenuItem.Builder
durante la creación.
Controladores de preferencias
Cada página de configuración puede contener varias Preferencias.
Consulta la siguiente imagen para ver cómo se relacionan estos componentes:
Figura 1: Componentes de CarSettings
PreferenceController
es un componente que se adapta al ciclo de vida y ayuda a encapsular la lógica empresarial relacionada con preferencias específicas.
PreferenceControllers
solo se puede adjuntar a la Preference 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 automóvil evita de forma explícita 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 app necesita saber en qué app debe actuar.
Debido a que PreferenceControllers
siempre se define en XML, no hay manera de proporcionar argumentos de constructor adicionales. En su lugar, estos valores adicionales se proporcionan a través de seters públicos en PreferenceController
y se configuran con 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 se use el método use(...)
, más difícil será mantener el objetivo original de poder reorganizar la jerarquía de configuración con cambios mínimos en el código Java, ya que se deben copiar grandes secciones del código de fragmento existente en el fragmento creado recientemente. 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()
).
Manejo de intents
Todos los intents que debe controlar la app de Configuración del vehículo se definen en el archivo manifiesto. Por lo general, los intents se definen y controlan como la mayoría de las apps estándar de Android, con todas las actividades y los filtros de intents definidos en el manifiesto.
Cambia el fragmento raíz
Si lo deseas, puedes mostrar o ocultar el ícono de Salir con config_show_settings_root_exit_icon
.
Cómo personalizar el tema
Personaliza otros atributos y recursos
La app de Configuración del automóvil usa principalmente CarSettingTheme
, que es una extensión de Theme.CarUi
. Este tema se usa para estandarizar el aspecto de las apps del sistema y garantizar la coherencia en el sistema.
Cómo personalizar las preferencias
Las preferencias de personalización abarcan estas ubicaciones adicionales:
- El diseño de algunas clases de preferencias básicas se define en
car_preference
y se superpone para las compilaciones de vehículos. Aquí se pueden reemplazar todos los diseños de personalización para las clases de preferencias básicas. - La configuración del vehículo usa algunas preferencias personalizadas definidas principalmente en el paquete
common
. Se deben superponer dentro del módulo de configuración del automóvil por separado de las clases de preferencia básicas.