Personalizar a barra de ferramentas com sobreposições de recursos no ambiente de execução

Visão geral do layout base

A barra de ferramentas car-ui-lib é personalizada pelo arquivo de layout car_ui_base_layout_toolbar.xml. Ela é chamada de barra de ferramentas do *layout base* porque esse arquivo de layout contém um FrameLayout com o id car_ui_base_layout_content_container, que vai conter todo o conteúdo do app logo após o layout ser inflado. Essa estrutura permite que o OEM coloque a barra de ferramentas em locais diferentes da parte de cima da tela.

Possíveis layouts
Layout da barra de ferramentas 1 Layout da barra de ferramentas 2 Layout da barra de ferramentas 3
Layout da barra de ferramentas 4 Layout da barra de ferramentas 5 Layout da barra de ferramentas 6

Ao mudar os parâmetros de layout no car_ui_base_layout_content_container, o app pode ser compactado em uma área menor para abrir espaço para a barra de ferramentas. No entanto, algumas personalizações podem exigir que a barra de ferramentas seja transparente e sobreposta ao app. Nesse caso, as visualizações podem ser marcadas com car_ui_top/bottom/left/right_inset. Se a car-ui-lib detectar uma visualização com essa tag, ela vai comunicar a posição e as dimensões dessa visualização ao app, para que o conteúdo possa ser recuado para dentro dessa quantidade, mas ainda manter um plano de fundo razoável no espaço abaixo da barra de ferramentas. Por exemplo, a maioria dos apps terá o primeiro item na CarUiRecyclerView começando abaixo dos insets especificados, mas ainda estará visível atrás da barra de ferramentas quando o usuário rolar para baixo.

Suporte para seletor giratório

Para oferecer suporte a controles rotativos, o layout base precisa conter um FocusParkingView o mais cedo possível no layout. Essa visualização é o que recebe o foco quando não há foco visível para o usuário. A barra de ferramentas também precisa ser embrulhada em um FocusParkingView, que especifica que ela é uma zona de empurrão separada para o controlador rotativo. Se não for envolvido em um FocusParkingView, o usuário não poderá interagir com a barra de ferramentas usando o controle giratório.

Guias

As guias da barra de ferramentas são personalizadas pelos arquivos de layout car_ui_toolbar_tab_item.xml ou car_ui_toolbar_tab_item_flexible.xml. Não há diferença funcional entre os arquivos. O recurso booleano car_ui_toolbar_tab_flexible_layout determina qual deles é usado. Como resultado, é recomendável manter car_ui_toolbar_tab_flexible_layout definido como false e personalizar apenas o arquivo de layout normal.

O ImageView da guia vai ser tingido com a cor car_ui_toolbar_tab_item_selector no código Java. Portanto, car_ui_toolbar_tab_item_selector precisa ser personalizado com o layout. Os apps podem solicitar que os ícones da guia não sejam coloridos com essa cor.

A TextView da guia tem a aparência de texto definida como TextAppearance.CarUi.Widget.Toolbar.Tab ou TextAppearance.CarUi.Widget.Toolbar.Tab.Selected no código Java. Portanto, a aparência de texto definida no arquivo de layout não será aplicada. Esses estilos também precisam ser personalizados.

MenuItems são os botões no canto superior direito da barra de ferramentas padrão. Eles podem ser texto, ícones, ícones e texto ou interruptores. Todas essas variações fazem parte do arquivo de layout car_ui_toolbar_menu_item, já que o MenuItems precisa ser capaz de mudar entre cada formulário se o app solicitar.

MenuItems pode ser primário, o que infla um arquivo de layout diferente: car_ui_toolbar_menu_item_primary. Um MenuItem principal precisa ser visualmente diferente do MenuItem normal, por exemplo, com um botão com borda/sem borda. Por padrão, car_ui_toolbar_menu_item_primary redireciona para car_ui_toolbar_menu_item, então eles têm a mesma aparência.

O MenuItems pode ser ativado, que é outro estado visual que indica que esse MenuItem está ativado. Esse estado é implementado chamando setActivated(true) na visualização MenuItem, que adiciona o estado state_activated a todos os drawables nas visualizações do MenuItem. Esse estado de drawable pode ser respondido com um seletor de drawable na sobreposição de recursos de tempo de execução (RRO, na sigla em inglês).

A MenuItems pode ser restringida pelo UX quando o veículo está em movimento. A restrição de UX é apenas outro estado de drawable, como ativado, mas dessa vez o estado é definido no app em vez do framework do Android. Isso significa que o atributo state_ux_restricted também precisa ser sobreposto ao RRO para que o atributo definido no RRO corresponda ao atributo definido no app.

A barra de pesquisa está contida em um arquivo de layout car_ui_toolbar_search_view separado para melhorar o desempenho da inflação de layout em apps que não precisam de uma barra de pesquisa. O FrameLayout com o id car_ui_toolbar_search_view_container vai conter a barra de pesquisa quando ela for inflada.