Panoramica

Impostazioni auto (packages/apps/Car/Settings) è fornita specificamente per Android Automotive OS (AAOS). Impostazioni auto è diversa da Impostazioni telefono (packages/apps/Settings). Sebbene contenga alcune impostazioni dello smartphone familiari, Impostazioni auto offre un'interfaccia utente visiva adattata all'auto, ottimizzazioni per evitare distrazioni al conducente e numerosi punti di contatto per la personalizzazione per gli OEM.

Oltre alla panoramica delle Impostazioni auto fornita di seguito, consulta questi argomenti correlati per saperne di più sulle Impostazioni auto:

Architettura e linee guida

La maggior parte delle pagine in Impostazioni auto è implementata come una serie di frammenti che estendono SettingsFragment, ognuno con la propria attività definita in CarSettingActivities. Queste attività statiche sono estese da BaseCarSettingsActivity. Esistono alcune eccezioni a questa regola, ad esempio alcuni frammenti speciali che estendono BaseFragment anziché SettingsFragment e alcune attività al di fuori di CarSettingActivities, che devono essere considerate come eccezioni (non come pattern da seguire).

Preferenze statiche

Una preferenza statica è definita in XML utilizzando il tag Preference o CarUiPreference. Un'implementazione SettingsFragment utilizza il metodo getPreferenceScreenResId() per definire quale file XML contiene l'elenco statico delle preferenze da visualizzare.

Preferenze dinamiche

Le preferenze dinamiche utilizzano il tag PreferenceGroup o un'implementazione di PreferenceGroup.

Nell'app CarSettings, le preferenze dinamiche rappresentano un normale insieme di preferenze che indirizzano l'utente ad altre pagine all'interno di CarSettings, ma che sono state aggiunte tramite PreferenceController anziché nel file XML. Un esempio è la preferenza Gestisci tastiere nella sezione Lingue e immissione, che aggiunge dinamicamente i metodi di immissione alla pagina delle preferenze in base al fatto che siano consentiti o meno.

Barre delle azioni

Nella parte superiore di ogni schermata delle impostazioni è presente una barra delle azioni, che può contenere un pulsante di navigazione "Indietro", un titolo della schermata e widget di azioni supplementari (ad esempio pulsanti e pulsanti di attivazione/disattivazione). Queste barre di azioni sono simili all'ActionBar fornito da Android, ma in realtà sono visualizzazioni personalizzate. In Android 11 e versioni successive, questa barra degli strumenti è inclusa nel layout di base del telaio, che contiene le visualizzazioni per la barra degli strumenti e un framelayout per il resto dei contenuti dell'app.

I widget di azioni supplementari sono classi MenuItem e devono essere creati nel onCreate del rispettivo SettingsFragment o BaseFragment. Proprietà come visibilità, stato e così via devono essere controllate dai setter nella logica di business del 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);
    }
}

Le barre di azioni supportano l'ottimizzazione delle distrazioni nelle impostazioni dell'auto. Imposta UXRestrictions in MenuItem.Builder al momento della creazione.

Controllori delle preferenze

Ogni pagina delle impostazioni può contenere una serie di diverse preferenze.

L'immagine seguente mostra la relazione tra questi componenti:

Componenti CarSettings

Figura 1. Componenti CarSettings

PreferenceController è un componente consapevole del ciclo di vita che consente di incapsulare la logica di business relativa a preferenze specifiche. PreferenceControllers può essere associato alla preferenza pertinente solo tramite 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>

Impostazioni auto impedisce esplicitamente la creazione di PreferenceController tramite codice per semplificare la modifica della gerarchia delle impostazioni con minime modifiche al codice Java.

È possibile che un PreferenceController abbia bisogno di alcuni dati dinamici per funzionare correttamente. Ad esempio, un PreferenceController che disattiva le notifiche per un'app deve sapere su quale app intervenire. Poiché PreferenceControllers sono sempre definiti in XML, non esiste un modo per fornire argomenti aggiuntivi del costruttore. Questi valori aggiuntivi vengono invece forniti tramite i setter pubblici su PreferenceController e impostati utilizzando il metodo use(...) di 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);
  }
}

Più spesso viene utilizzato il metodo use(...), più diventa difficile mantenere lo scopo originale di poter riorganizzare la gerarchia delle impostazioni con modifiche minime al codice Java, perché è necessario copiare grandi sezioni del codice del frammento esistente nel frammento appena creato. Un modo per ridurre al minimo la difficoltà di questa operazione è:

  • Riduci al minimo l'utilizzo di use(...).
  • Prova a mantenere tutte le chiamate a use(...) in un unico punto del frammento (ad esempio nel metodo onAttach()).

Gestione degli intent

Tutti gli intent che devono essere gestiti dall'app Impostazioni auto sono definiti nel file manifest. In genere, gli intent vengono definiti e gestiti come la maggior parte delle app Android standard, con tutte le attività e i filtri per intent definiti nel file manifest.

Modificare il frammento principale

Se vuoi, puoi visualizzare o nascondere l'icona Esci utilizzando config_show_settings_root_exit_icon.

Personalizzare il tema

Personalizzare altri attributi e risorse

L'app Impostazioni auto utilizza principalmente CarSettingTheme, che è un'estensione di Theme.CarUi. Questo tema viene utilizzato per standardizzare il look and feel delle app di sistema al fine di garantire la coerenza del sistema.

Personalizzare le preferenze

Le preferenze di personalizzazione riguardano le seguenti posizioni aggiuntive:

  • Il layout di alcuni gruppi di preferenze di base è definito in car_preference e sovrapposto per le build per auto. Qui è possibile sostituire eventuali layout di personalizzazione per le classi di preferenze di base.
  • Impostazioni auto utilizza alcune preferenze personalizzate definite principalmente nel common package. Queste devono essere sovrapposte nel modulo Impostazioni auto separatamente dalle classi di preferenze di base.