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
). A seção "Configurações do carro"
contém algumas configurações conhecidas do smartphone,
O recurso "Configurações do carro" oferece uma interface do usuário produzida para carros, otimizações para distração do motorista,
e vários pontos de entrada de personalização para OEMs.
Além da visão geral do "Configurações do carro" abaixo, consulte os vídeos relacionados para saber mais sobre a seção "Configurações do carro":
- 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 de 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 uma com a própria atividade definida em
CarSettingActivities (link em inglês). Essas atividades estáticas são estendidas da 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 elas precisam 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 classe Preference.
ou CarUiPreference
tag. Uma implementação de SettingsFragment
usa o 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 classe PreferenceGroup tag 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 para páginas adicionais em CarSettings, mas que foram adicionados pela função Preference Controller em vez de no XML. Um exemplo é o módulo "Gerenciar teclados" preferência em "Idiomas e Preferência de entrada que adiciona dinamicamente a entrada à página de preferências com base em se esses métodos de entrada são ou não permitidos ou não.
Barras de ações
A parte superior de cada tela de configurações tem uma barra de ações, que pode conter um "voltar" de navegação, um título de tela e widgets de ação suplementar (por exemplo, e interruptores). Essas barras de ações são semelhantes à ActionBar fornecidas pelo Android, mas, na verdade, são visualizações personalizadas. No Android 11 e versões mais recentes, está incluída no layout base do chassi, que contém as visualizações do barra de ferramentas e um framelayout para o restante do conteúdo do app.
Os widgets de ação complementares são classes MenuItem e precisam ser criados
os onCreate
dos respectivos SettingsFragment
ou
BaseFragment
Propriedades como visibilidade, estado etc. devem
ser controlados 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 oferecem suporte a
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ários Preferências.
Confira 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 relacionada a preferências específicas.
PreferenceControllers
só pode ser anexado à 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>
As configurações do carro impedem explicitamente a criação do PreferenceController
pelo código para facilitar a modificação da hierarquia de configurações com o mínimo
mudanças no código Java.
É possível que um PreferenceController
precise de alguns dados dinâmicos
para funcionar corretamente. Por exemplo, uma PreferenceController
que desativa
as notificações de um app precisa saber em qual app agir.
Como PreferenceControllers
são sempre definidos em XML, não há
de fornecer mais 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(...)
é usado, mais difícil fica manter
o objetivo original de reorganizar a hierarquia de configurações com alterações mínimas no
o código Java, porque grandes seções do código de fragmento existente precisam ser copiadas para
o fragmento recém-criado. Uma maneira de minimizar a dificuldade de fazer isso é:
- Minimize o uso do
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 devem ser gerenciadas pelo app Configurações do carro são definidas no manifestar . As intents geralmente são definidas e processadas como a maioria dos apps Android padrão, com todas as atividades e filtros de intents definidos no manifesto.
Mudar o fragmento raiz
Se você quiser, 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 e função dos aplicativos do sistema para garantir a consistência no sistema.
Personalizar preferências
A personalização de preferências abrange estes outros locais:
- O layout de algumas classes de preferência de base é definido em
car_preference
e sobrepostos para construções de carros. Todos os layouts de personalização para as classes de preferências básicas podem ser substituído aqui. - O recurso "Configurações do carro" usa algumas preferências personalizadas definidas principalmente no
common
. Eles devem ser sobrepostos no módulo "Configurações do carro" separadamente as classes de preferência básicas.