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:
- Aggiunta delle impostazioni dell'auto
- Riorganizzare le impostazioni dell'auto
- Ottimizzazione della distrazione nelle impostazioni dell'auto
- Indicizzazione della ricerca delle impostazioni dell'auto
- Personalizzazione del doppio pannello
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:
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 metodoonAttach()
).
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.