Panoramica

Le impostazioni dell'auto ( packages/apps/Car/Settings ) sono fornite specificamente per il sistema operativo Android Automotive (AAOS). Le Impostazioni dell'auto sono diverse dalle Impostazioni del telefono ( packages/apps/Settings ). Mentre Impostazioni auto contiene alcune impostazioni familiari del telefono, Impostazioni auto fornisce un'interfaccia utente visiva unificata per l'auto , ottimizzazioni per la distrazione del conducente e numerosi punti di ingresso 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 Car Settings sono implementate come una serie di frammenti che estendono SettingsFragment , ciascuno con la propria attività definita in CarSettingActivities . Queste attività statiche sono estese da BaseCarSettingsActivity . Sebbene esistano alcune eccezioni a questa regola, come alcuni frammenti speciali che estendono BaseFragment anziché SettingsFragment e alcune Attività che risiedono all'esterno di CarSettingActivities , i quali dovrebbero essere tutti considerati eccezioni (non modelli da seguire).

Preferenze statiche

Una preferenza statica viene 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 di preferenze da visualizzare.

Preferenze dinamiche

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

All'interno dell'app CarSettings, le preferenze dinamiche rappresentano un normale insieme di preferenze che indirizzano l'utente a pagine aggiuntive all'interno di CarSettings, ma che sono state aggiunte tramite il controller delle preferenze anziché nell'XML. Un esempio è la preferenza Gestisci tastiere nella preferenza Lingue e input che aggiunge dinamicamente metodi di input alla pagina delle preferenze in base al fatto che questi metodi di input siano consentiti o meno.

Barre di azione

La parte superiore di ogni schermata delle impostazioni presenta una barra delle azioni, che può contenere una navigazione "indietro", un titolo della schermata e widget di azioni supplementari (ad esempio pulsanti e interruttori). Queste barre delle azioni sono simili all'ActionBar fornita da Android, ma in realtà sono visualizzazioni personalizzate. In Android 11 e versioni successive, questa barra degli strumenti è inclusa nel layout di base dello chassis, che contiene le visualizzazioni per la barra degli strumenti e un layout del frame per il resto del contenuto dell'app.

I widget di azioni supplementari sono classi MenuItem e devono essere creati in onCreate dei rispettivi SettingsFragment o BaseFragment . Proprietà come visibilità, stato e così via dovrebbero essere controllate dai setter nella logica aziendale di 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 delle azioni sono dotate del supporto per l'ottimizzazione della distrazione nelle Impostazioni auto . Imposta le restrizioni UX in MenuItem.Builder al momento della creazione.

Controller delle preferenze

Ciascuna pagina delle impostazioni può contenere diverse preferenze .

Vedere l'immagine seguente per sapere come sono correlati questi componenti:

Componenti di CarSettings

Figura 1. Componenti di CarSettings

PreferenceController è un componente sensibile al ciclo di vita che aiuta a incapsulare la logica aziendale relativa a preferenze specifiche. PreferenceControllers possono essere collegati 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>

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

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

Quanto più spesso viene utilizzato il metodo use(...) , tanto più difficile diventa mantenere l'obiettivo originale di essere in grado di riorganizzare la gerarchia delle impostazioni con modifiche minime al codice Java, perché ampie sezioni del codice del frammento esistente devono essere copiato nel frammento appena creato. Un modo per ridurre al minimo la difficoltà di eseguire questa operazione è:

  • Riduci al minimo l'utilizzo di use(...) .
  • Prova a mantenere ogni chiamata a use(...) in un posto nel frammento (ad esempio, nel metodo onAttach() ).

Gestione delle intenzioni

Tutti gli intenti che dovrebbero essere gestiti dall'app Impostazioni auto sono definiti nel file manifest . Gli intenti sono generalmente definiti e gestiti come la maggior parte delle app Android standard, con tutte le attività e i filtri di intent definiti nel manifest.

Cambia il frammento della radice

Se lo si desidera, l'icona Esci può essere visualizzata o nascosta utilizzando config_show_settings_root_exit_icon .

Personalizza il tema

Personalizza altri attributi e risorse

L'app Impostazioni auto utilizza principalmente CarSettingTheme , che è un'estensione di Theme.CarUi . Questo tema viene utilizzato per standardizzare l'aspetto delle app di sistema per garantire la coerenza del sistema.

Personalizza le preferenze

La personalizzazione delle preferenze abbraccia queste posizioni aggiuntive:

  • Il layout di alcune classi di preferenze di base è definito in car_preference e sovrapposto per le build delle auto. Qualsiasi layout di personalizzazione per le classi di preferenza di base può essere sostituito qui.
  • Impostazioni auto utilizza alcune preferenze personalizzate definite principalmente nel pacchetto common . Questi dovrebbero essere sovrapposti all'interno del modulo Impostazioni auto separatamente dalle classi di preferenza di base.