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

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:

Componentes de configurações do carro

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

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.