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