Vue d'ensemble

Les paramètres de la voiture ( packages/apps/Car/Settings ) sont fournis spécifiquement pour le système d'exploitation Android Automotive (AAOS). Les paramètres de la voiture diffèrent des paramètres du téléphone ( packages/apps/Settings ). Alors que Car Settings contient certains paramètres de téléphone familiers, Car Settings fournit une interface utilisateur visuelle adaptée à la voiture , des optimisations de distraction du conducteur et de nombreux points d'entrée de personnalisation pour les constructeurs OEM.

En plus de l'aperçu des paramètres de la voiture fourni ci-dessous, consultez ces rubriques connexes pour en savoir plus sur les paramètres de la voiture :

Architecture et lignes directrices

La plupart des pages de Car Settings 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 . Bien qu'il existe quelques exceptions à cette règle, comme certains fragments spéciaux étendant BaseFragment plutôt que SettingsFragment et certaines Activities résidant en dehors de CarSettingActivities , qui doivent tous être considérés 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 quel fichier XML contient 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 dirigent l'utilisateur vers des pages supplémentaires dans CarSettings, mais qui ont été ajoutées via le contrôleur de préférences plutôt que dans le XML. Un exemple est la préférence Gérer les claviers sous la préférence Langues et saisie qui ajoute dynamiquement des méthodes de saisie à la page de préférences selon que ces méthodes de saisie sont autorisées ou non.

Barres d'action

Le haut de chaque écran de paramètres comporte une barre d'action, qui peut contenir une navigation « retour », un titre d'écran et des widgets d'action supplémentaires (par exemple, des boutons et des commutateurs). Ces barres d'action sont similaires à l' ActionBar fournie par Android, mais sont en réalité des vues personnalisées. Sous Android 11 et versions ultérieures, cette barre d'outils est incluse dans la disposition de base du châssis, qui contient les vues de la barre d'outils et une disposition de cadre 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 du SettingsFragment ou BaseFragment respectif. Les propriétés telles que la visibilité, l'état, etc. doivent être contrôlées par les setters 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 prennent en charge 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.

Consultez l'image suivante pour connaître la relation entre ces composants :

Composants CarSettings

Figure 1. Composants CarSettings

Le PreferenceController est un composant prenant en compte le cycle de vie qui permet d'encapsuler la logique métier relative à des préférences spécifiques. PreferenceControllers ne peuvent être attachés à 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>

Car Settings empêche explicitement la création de PreferenceController via le code afin de faciliter la modification de la hiérarchie des paramètres avec des modifications minimes 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 sur quelle application agir. Étant donné que PreferenceControllers sont toujours définis en XML, il n'existe aucun moyen de fournir des arguments de constructeur supplémentaires. Au lieu de cela, ces valeurs supplémentaires sont fournies via des setters publics sur le PreferenceController et définies à l'aide de la méthode use(...) du 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 souvent, plus il devient difficile de conserver l'objectif initial de pouvoir réorganiser la hiérarchie des paramètres avec des modifications minimes du code Java, car de grandes sections du code fragmenté existant doivent être copié dans le fragment nouvellement créé. Une façon de minimiser la difficulté de cette opération consiste à :

  • Minimisez votre utilisation de use(...) .
  • Essayez de conserver chaque appel à use(...) au même endroit dans le fragment (par exemple, dans la méthode onAttach() ).

Gestion des intentions

Toutes les intentions qui doivent être gérées par l'application Car Settings sont définies dans le fichier manifeste . Les intentions sont généralement définies et gérées comme la plupart des applications Android standard, avec toutes les activités et filtres d'intention définis dans le manifeste.

Changer le fragment racine

Si vous le souhaitez, l'icône Quitter peut être affichée ou masquée à l'aide de config_show_settings_root_exit_icon .

Personnaliser le thème

Personnaliser d'autres attributs et ressources

L'application Car Settings utilise principalement CarSettingTheme , qui est une extension de Theme.CarUi . Ce thème est utilisé pour standardiser l’apparence des applications système afin de garantir la cohérence du système.

Personnaliser les préférences

La personnalisation des préférences couvre ces emplacements supplémentaires :

  • La disposition de certaines classes de préférences de base est définie dans car_preference et superposée pour les constructions de voitures. Toutes les dispositions de personnalisation pour les classes de préférences de base peuvent être remplacées ici.
  • Les paramètres de la voiture utilisent certaines préférences personnalisées définies principalement dans le package common . Ceux-ci doivent être superposés dans le module Paramètres de la voiture séparément des classes de préférences de base.