As configurações do carro ( packages/apps/Car/Settings
) são fornecidas especificamente para o Android Automotive OS (AAOS). As configurações do carro são diferentes das configurações do telefone ( packages/apps/Settings
). Embora Car Settings contenha algumas configurações de telefone familiares, Car Settings fornece uma interface de usuário visual personalizada para o carro , otimizações de distração do motorista e vários pontos de entrada de personalização para OEMs.
Além da visão geral das Configurações do carro fornecida abaixo, consulte estes tópicos relacionados para saber mais sobre as Configurações do carro:
- Adicionando configurações do carro
- Reorganizando as configurações do carro
- Otimização de distração nas configurações do carro
- Indexação de pesquisa de configurações de carro
- Personalização de painel duplo
Arquitetura e diretrizes
A maioria das páginas em Car Settings são implementadas como uma série de fragmentos que estendem SettingsFragment , cada um com sua própria atividade definida em CarSettingActivities . Essas atividades estáticas são estendidas de BaseCarSettingsActivity . Embora existam algumas exceções a esta regra, como alguns fragmentos especiais que estendem BaseFragment em vez de SettingsFragment
e algumas Atividades que residem fora de CarSettingActivities , todas devem ser consideradas exceções (não como padrões a seguir).
Preferências estáticas
Uma preferência estática é definida em XML usando a tag Preference ou CarUiPreference . Uma implementação SettingsFragment
usa o método getPreferenceScreenResId()
para definir qual arquivo XML contém a lista estática de preferências a serem exibidas.
Preferências dinâmicas
As preferências dinâmicas usam a tag PreferenceGroup ou uma implementação de PreferenceGroup.
Dentro do aplicativo CarSettings, as preferências dinâmicas representam um conjunto normal de preferências que direcionam o usuário para páginas adicionais dentro do CarSettings, mas que foram adicionadas por meio do Preference Controller em vez de no XML. Um exemplo é a preferência Gerenciar teclados na preferência Idiomas e entrada, que adiciona métodos de entrada dinamicamente à página de preferências com base no fato de esses métodos de entrada serem permitidos ou não.
Barras de ação
A parte superior de cada tela de configurações possui uma barra de ação, que pode conter uma navegação "voltar", um título de tela e widgets de ação complementares (por exemplo, botões e interruptores). Essas barras de ação são semelhantes ao ActionBar fornecido pelo Android, mas na verdade são visualizações personalizadas. No Android 11 e versões posteriores, essa barra de ferramentas está incluída no layout base do chassi, que contém as visualizações da barra de ferramentas e um layout de quadro para o restante do conteúdo do aplicativo.
Widgets de ação suplementares são classes MenuItem e devem ser criados no onCreate
do respectivo SettingsFragment
ou BaseFragment
. Propriedades como visibilidade, estado e assim por diante devem ser controladas por configuradores na lógica de negócios do 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); } }
As barras de ação vêm com suporte para Otimização de Distração nas Configurações do Carro . Defina as UXRestrictions no MenuItem.Builder
na criação.
Controladores de preferência
Cada página de configurações pode conter diversas preferências .
Veja a imagem a seguir para saber como esses componentes estão relacionados:
Figura 1. Componentes CarSettings
O PreferenceController
é um componente com reconhecimento de ciclo de vida que ajuda a encapsular a lógica de negócios pertencente a preferências específicas. PreferenceControllers
só podem ser anexados à preferência relevante por meio de 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 impede explicitamente a criação de PreferenceController
por meio de código para facilitar a modificação da hierarquia de Configurações com alterações mínimas no código Java.
É possível que um PreferenceController
precise de alguns dados dinâmicos para funcionar corretamente. Por exemplo, um PreferenceController
que desativa notificações de um aplicativo precisa saber em qual aplicativo agir. Como PreferenceControllers
são sempre definidos em XML, não há como fornecer argumentos de construtor adicionais. Em vez disso, esses valores adicionais são fornecidos por meio de setters públicos no PreferenceController
e definidos usando o método use(...)
do 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 mais frequentemente o método use(...)
é usado, mais difícil se torna manter o objetivo original de ser capaz de reorganizar a hierarquia de configurações com alterações mínimas no código Java, porque grandes seções do código de fragmento existente precisam ser copiado para o fragmento recém-criado. Uma maneira de minimizar a dificuldade de fazer isso é:
- Minimize o uso de
use(...)
. - Tente manter cada chamada para
use(...)
em um lugar no fragmento (por exemplo, no métodoonAttach()
).
Tratamento de intenções
Todas as intenções que devem ser tratadas pelo aplicativo Car Settings são definidas no arquivo de manifesto . As intenções geralmente são definidas e tratadas como a maioria dos aplicativos Android padrão, com todas as atividades e filtros de intenções definidos no manifesto.
Alterar o fragmento raiz
Se desejar, o ícone Sair pode ser exibido ou ocultado usando config_show_settings_root_exit_icon
.
Personalize o tema
Personalize outros atributos e recursos
O aplicativo Car Settings usa principalmente CarSettingTheme
, que é uma extensão de Theme.CarUi
. Este tema é usado para padronizar a aparência dos aplicativos do sistema para garantir consistência no sistema.
Personalize preferências
A personalização de preferências abrange estes locais adicionais:
- O layout de algumas classes de preferência base é definido em
car_preference
e sobreposto para construções de carros. Quaisquer layouts de customização para as classes de preferência base podem ser substituídos aqui. - As configurações do carro usam algumas preferências personalizadas definidas principalmente no pacote
common
. Eles devem ser sobrepostos no módulo Configurações do carro separadamente das classes de preferência básicas.