Resumen,Resumen

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 de teléfono familiares, 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:

Arquitectura y directrices

La mayoría de las páginas de Car Settings se implementan como una serie de fragmentos que amplían 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 las cuales deben considerarse excepciones (no como patrones a seguir).

Preferencias estáticas

Una preferencia estática se define en XML utilizando la etiqueta Preference o CarUiPreference . Una implementación de SettingsFragment usa 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 usan la etiqueta PreferenceGroup > o una implementación de PreferenceGroup como LogicalPreferenceGroup para definir un conjunto de preferencias que son generadas y controladas por Preference Controllers .

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 del 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 acción, que puede contener una navegación "atrás", un título de pantalla y widgets de acción complementarios (por ejemplo, botones e interruptores). Estas barras de acción son similares a laActionBar 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 complementarios son clases MenuItem y deben crearse en onCreate de los SettingsFragment o BaseFragment respectivos. Las propiedades, como la visibilidad, el estado, etc., deben ser controladas por establecedores en la lógica comercial 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 vienen con soporte para la optimización de distracciones en la configuración del automóvil . Establezca las restricciones de UX en el MenuItem.Builder en la creación.

Controladores de preferencias

Cada página de configuración puede contener varias Preferencias . Para ayudar a mantener la organización del código, cada preferencia o un grupo relacionado de preferencias tiene un PreferenceController asociado.

Consulte la siguiente imagen para ver cómo se relacionan estos componentes:

Componentes CarSettings

Figura 1. Componentes CarSettings

El PreferenceController es un componente consciente del ciclo de vida que ayuda a encapsular la lógica comercial 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 los PreferenceControllers siempre se definen en XML, no hay forma de proporcionar argumentos de construcción adicionales. En su lugar, 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 utilice 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 será necesario cambiar grandes secciones del código de fragmento existente. copiarse en el fragmento recién creado. Una forma de minimizar la dificultad de hacer esto es:

  • Minimice su uso de use(...) .
  • Intente mantener todas las llamadas a use(...) en un solo lugar en el fragmento (por ejemplo, en el método onAttach() ).

manejo de intenciones

Todos los intentos que debe manejar la aplicación Car Settings están definidos 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.

Cambiando el fragmento raíz

De forma predeterminada, Car Settings muestra el HomepageFragment cuando se inicia la aplicación. Esto se puede configurar para que sea QuickSettingFragment invirtiendo los valores booleanos para config_is_quick_settings_root , config_enable_home_settings_icon y config_enable_quick_settings_icon .

Si lo desea, el ícono Salir se puede mostrar u ocultar usando config_show_settings_root_exit_icon .

Personalizando el tema

Personalización de otros atributos y recursos

La aplicación Car Settings utiliza principalmente CarSettingTheme , que es una extensión de Theme.CarUi . Este tema se usa para estandarizar la apariencia de las aplicaciones del sistema para garantizar la coherencia en el sistema.

Personalización de 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í.
  • Car Settings 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.