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 smartphone
(packages/apps/Settings
). Embora as configurações do carro contenham algumas configurações conhecidas do smartphone,
elas oferecem uma interface do usuário para carros, otimizações para distrações 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:
- Como adicionar configurações do carro
- Como reorganizar as configurações do carro
- Otimização de distração nas configurações do carro
- Indexação de pesquisa das configurações do carro
- Personalização do painel duplo
Arquitetura e diretrizes
A maioria das páginas em "Configurações do carro" é implementada como uma série de fragmentos
que estendem SettingsFragment, cada um com a própria atividade definida em
CarSettingActivities. Essas atividades estáticas são estendidas de BaseCarSettingsActivity. Embora haja algumas exceções a essa regra, como alguns fragmentos especiais que estendem
BaseFragment em vez de SettingsFragment
e algumas atividades que residem fora das CarSettingActivities, todas elas devem ser consideradas exceções (não como padrões a serem seguidos).
Preferências estáticas
Uma preferência estática é definida em XML usando a tag
Preference
ou CarUiPreference. Uma implementação de 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.
No app CarSettings, as preferências dinâmicas representam um conjunto normal de preferências que direcionam o usuário a outras páginas no CarSettings, mas que foram adicionadas pelo Preference Controller em vez de no XML. Um exemplo é a preferência "Gerenciar teclados" em "Idiomas e preferências de entrada", que adiciona dinamicamente métodos de entrada à página de preferências com base na permissão ou não desses métodos.
Barras de ações
A parte de cima de cada tela de configurações tem uma barra de ações, 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 à ActionBar fornecida pelo Android, mas são visualizações personalizadas. No Android 11 e versões mais recentes, essa barra de ferramentas está incluída no layout de base do chassi, que contém as visualizações para a barra de ferramentas e um framelayout para o restante do conteúdo do app.
Os widgets de ação suplementar são classes MenuItem e precisam ser criados no
onCreate
do SettingsFragment
ou
BaseFragment
correspondente. Propriedades como visibilidade, estado e assim por diante precisam
ser controladas por setters 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 têm suporte para
Otimização de distração nas configurações do carro.
Defina as UXRestrictions no MenuItem.Builder
na criação.
Controladores de preferências
Cada página de configurações pode conter várias preferências.
Confira a imagem a seguir para saber como esses componentes estão relacionados:
Figura 1. CarSettings Components
O PreferenceController
é um componente ciente do ciclo de vida que ajuda a
encapsular a lógica de negócios relacionada a preferências específicas.
O PreferenceControllers
só pode ser anexado à preferência relevante por
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>
As configurações do carro impedem explicitamente a criação de PreferenceController
por código para facilitar a modificação da hierarquia de configurações com mudanças 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
as notificações de um app precisa saber em qual app agir.
Como PreferenceControllers
é sempre definido em XML, não há
como fornecer outros argumentos de construtor. Em vez disso, esses valores adicionais são
fornecidos por 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 o método use(...)
for usado, mais difícil será manter
a meta original de reorganizar a hierarquia de configurações com mudanças mínimas no
código Java, porque grandes seções do código do fragmento precisam ser copiadas para
o fragmento recém-criado. Uma maneira de minimizar a dificuldade de fazer isso é:
- Reduza o uso de
use(...)
. - Tente manter todas as chamadas para
use(...)
em um só lugar no fragmento (por exemplo, no métodoonAttach()
).
Processamento de intents
Todas as intents que precisam ser processadas pelo app Configurações do carro são definidas no arquivo manifest. As intents geralmente são definidas e processadas como a maioria dos apps Android padrão, com todas as atividades e filtros de intent definidos no manifesto.
Mudar o fragmento raiz
Se desejar, o ícone de saída pode ser mostrado ou ocultado usando config_show_settings_root_exit_icon
.
Personalizar o tema
Personalizar outros atributos e recursos
O app Configurações do carro usa principalmente o CarSettingTheme
,
que é uma extensão de Theme.CarUi
. Esse tema é usado para padronizar a
aparência dos apps do sistema e garantir a consistência no sistema.
Personalizar preferências
A personalização das preferências abrange estes outros locais:
- O layout de algumas classes de preferências básicas é definido em
car_preference
e sobreposto para builds de carros. Todos os layouts de personalização das classes de preferências básicas podem ser substituídos aqui. - As configurações do carro usam algumas preferências personalizadas definidas principalmente no
pacote
common
. Elas precisam ser sobrepostas no módulo "Configurações do carro" separadamente das classes de preferências básicas.