Visão geral

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":

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:

Componentes do CarSettings

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étodo onAttach().
.

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.