As configurações do carro ( packages/apps/Car/Settings
) são fornecidas especificamente para o Android Automotive OS (AAOS). As configurações do carro diferem das configurações do telefone ( packages/apps/Settings
). Embora as configurações do carro contenham algumas configurações familiares do telefone, as configurações do carro fornecem 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 fornecidas 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 do 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 essa 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 marca 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 como LogicalPreferenceGroup para definir um conjunto de preferências que são geradas e controladas por Preference Controllers .
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 dinamicamente métodos de entrada à página de preferências com base em se esses métodos de entrada são permitidos ou não.
Barras de ação
A parte superior de cada tela de configurações tem uma barra de ação, que pode conter uma navegação "voltar", um título de tela e widgets de ação suplementares (por exemplo, botões e interruptores). Essas barras de ação são semelhantes àActionBar fornecida pelo Android, mas na verdade são visualizações personalizadas. No Android 11 e superior, 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 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 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 várias Preferências . Para ajudar a manter a organização do código, cada preferência ou um grupo relacionado de preferências tem um PreferenceController associado a ele.
Veja a imagem a seguir para saber como esses componentes estão relacionados:
Figura 1. Componentes CarSettings
O PreferenceController
é um componente ciente do ciclo de vida que ajuda a encapsular a lógica de negócios pertencente a preferências específicas. PreferenceControllers
só podem ser anexados à Preference 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>
As configurações do carro impedem 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 operar corretamente. Por exemplo, um PreferenceController
que desativa as notificações de um aplicativo precisa saber em qual aplicativo agir. Como PreferenceControllers
sempre são 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 poder reorganizar a hierarquia de configurações com alterações mínimas no código Java, uma vez que grandes seções do código de fragmento existente precisarão ser copiado para o fragmento recém-criado. Uma maneira de minimizar a dificuldade de fazer isso é:
- Minimize seu uso de
use(...)
. - Tente manter todas as chamadas para
use(...)
em um lugar no fragmento (por exemplo, no métodoonAttach()
).
Manipulação de intenção
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ção definidos no manifesto.
Alterando o fragmento raiz
Por padrão, as configurações do carro mostram o HomepageFragment
quando o aplicativo é iniciado. Isso pode ser configurado para ser o QuickSettingFragment
invertendo os valores booleanos para config_is_quick_settings_root
, config_enable_home_settings_icon
e config_enable_quick_settings_icon
.
Se desejado, o ícone Sair pode ser exibido ou ocultado usando config_show_settings_root_exit_icon
.
Personalizando o tema
Personalizando outros atributos e recursos
O aplicativo Car Settings usa principalmente o CarSettingTheme
, que é uma extensão do Theme.CarUi
. Este tema é usado para padronizar a aparência dos aplicativos do sistema para garantir consistência no sistema.
Personalizando preferências
A personalização das preferências abrange estes locais adicionais:
- O layout de algumas classes de preferências básicas é definido em
car_preference
e sobreposto para construções de carros. Quaisquer layouts de personalizaçã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.