Aperçu

Les paramètres de la voiture (packages/apps/Car/Settings) sont fournis spécifiquement pour Android Automotive OS (AAOS). Les paramètres de la voiture diffèrent des paramètres du téléphone (packages/apps/Settings). Bien que les paramètres de la voiture contiennent des paramètres de téléphone familiers, ils fournissent une interface utilisateur visuelle adaptée à la voiture, des optimisations pour éviter les distractions du conducteur et de nombreux points d'entrée de personnalisation pour les OEM.

En plus de la présentation des paramètres de la voiture ci-dessous, consultez les sujets associés suivants pour en savoir plus sur les paramètres de la voiture:

Architecture et consignes

La plupart des pages des paramètres de la voiture sont implémentées sous la forme d'une série de fragments qui étendent SettingsFragment, chacun ayant sa propre activité définie dans CarSettingActivities. Ces activités statiques sont étendues à partir de BaseCarSettingsActivity. Il existe quelques exceptions à cette règle, comme certains fragments spéciaux qui étendent BaseFragment plutôt que SettingsFragment et certaines activités situées en dehors de CarSettingActivities, qui doivent toutes être considérées comme des exceptions (et non comme des modèles à suivre).

Préférences statiques

Une préférence statique est définie en XML à l'aide de la balise Preference ou CarUiPreference. Une implémentation SettingsFragment utilise la méthode getPreferenceScreenResId() pour définir le fichier XML contenant la liste statique des préférences à afficher.

Préférences dynamiques

Les préférences dynamiques utilisent la balise PreferenceGroup ou une implémentation de PreferenceGroup.

Dans l'application CarSettings, les préférences dynamiques représentent un ensemble normal de préférences qui redirigent l'utilisateur vers des pages supplémentaires dans CarSettings, mais qui ont été ajoutées via le contrôleur de préférences au lieu de l'élément XML. Par exemple, la préférence "Gérer les claviers" sous "Langues et saisie" ajoute dynamiquement des modes de saisie à la page de préférences en fonction de leur autorisation ou non.

Barres d'action

En haut de chaque écran de paramètres se trouve une barre d'action, qui peut contenir une navigation "Retour", un titre d'écran et des widgets d'action supplémentaires (boutons et boutons d'activation/de désactivation, par exemple). Ces barres d'action sont similaires à la barre d'action fournie par Android, mais il s'agit en réalité de vues personnalisées. Sous Android 11 et versions ultérieures, cette barre d'outils est incluse dans la mise en page de base du châssis, qui contient les vues de la barre d'outils et une mise en page de framelayout pour le reste du contenu de l'application.

Les widgets d'action supplémentaires sont des classes MenuItem et doivent être créés dans le onCreate de l'SettingsFragment ou de l'BaseFragment respectif. Les propriétés telles que la visibilité, l'état, etc. doivent être contrôlées par des sétteurs dans la logique métier 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);
    }
}

Les barres d'action sont compatibles avec l'optimisation des distractions dans les paramètres de la voiture. Définissez les UXRestrictions dans MenuItem.Builder lors de la création.

Contrôleurs de préférences

Chaque page de paramètres peut contenir un certain nombre de Préférences différentes.

L'image suivante montre comment ces composants sont liés:

Composants CarSettings

Figure 1. Composants CarSettings

PreferenceController est un composant compatible avec le cycle de vie qui permet d'encapsuler la logique métier concernant des préférences spécifiques. PreferenceControllers ne peut être associé à la préférence appropriée que via 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>

Les paramètres de la voiture empêchent explicitement la création de PreferenceController via le code afin de faciliter la modification de la hiérarchie des paramètres avec des modifications minimales du code Java.

Il est possible qu'un PreferenceController ait besoin de données dynamiques pour fonctionner correctement. Par exemple, un PreferenceController qui désactive les notifications pour une application doit savoir quelle application doit être traitée. Étant donné que les PreferenceControllers sont toujours définis en XML, il n'est pas possible de fournir d'arguments de constructeur supplémentaires. Au lieu de cela, ces valeurs supplémentaires sont fournies via des setteurs publics sur PreferenceController et définies à l'aide de la méthode use(...) à partir 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);
  }
}

Plus la méthode use(...) est utilisée, plus il devient difficile de conserver l'objectif initial, à savoir pouvoir réorganiser la hiérarchie des paramètres avec un minimum de modifications apportées au code Java, car de grandes sections du code de fragment existant doivent être copiées dans le fragment nouvellement créé. Pour faciliter cette tâche, vous pouvez procéder comme suit:

  • Limitez votre utilisation de use(...).
  • Essayez de regrouper tous les appels à use(...) au même endroit dans le fragment (par exemple, dans la méthode onAttach()).

Gestion des intents

Tous les intents qui doivent être gérés par l'application Paramètres de la voiture sont définis dans le fichier manifeste. Les intents sont généralement définis et gérés comme la plupart des applications Android standards, avec toutes les activités et les filtres d'intent définis dans le fichier manifeste.

Modifier le fragment racine

Si vous le souhaitez, vous pouvez afficher ou masquer l'icône de sortie à l'aide de config_show_settings_root_exit_icon.

Personnaliser le thème

Personnaliser d'autres attributs et ressources

L'application Paramètres de la voiture utilise principalement CarSettingTheme, qui est une extension de Theme.CarUi. Ce thème permet de normaliser l'apparence des applications système afin de garantir la cohérence du système.

Personnaliser les préférences

Les préférences de personnalisation s'appliquent aux emplacements supplémentaires suivants:

  • La mise en page de certaines classes de préférences de base est définie dans car_preference et superposée pour les builds de voitures. Vous pouvez remplacer ici toutes les mises en page de personnalisation des classes de préférences de base.
  • Les paramètres de la voiture utilisent certaines préférences personnalisées définies principalement dans le package common. Ils doivent être superposés dans le module "Paramètres de la voiture", séparément des classes de préférences de base.