Aprimorar seu widget

Esta página inclui detalhes para melhorias opcionais de widgets disponíveis no Android 12 (nível 31 da API) e versões mais recentes. Esses recursos são opcionais, mas são simples de implementar e melhorar a experiência dos widgets dos usuários.

Usar cores dinâmicas

A partir do Android 12, um widget pode usar as cores do tema do dispositivo para botões, planos de fundo e outros componentes. Isso proporciona transições mais suaves e consistência em diferentes widgets.

Há duas maneiras de obter cores dinâmicas:

Depois que o tema é definido no layout raiz, você pode usar atributos de cor comuns na raiz ou em qualquer um dos filhos para captar as cores dinâmicas.

Confira alguns exemplos de atributos de cor que podem ser usados:

  • ?attr/primary
  • ?attr/primaryContainer
  • ?attr/onPrimary
  • ?attr/onPrimaryContainer

No exemplo abaixo, que usa o tema do Material 3, a cor do tema do dispositivo é "roxo". A cor de destaque e o plano de fundo do widget se adaptam aos modos claro e escuro, como mostrado nas Figuras 1 e 2.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="?attr/colorPrimaryContainer"
  android:theme="@style/Theme.Material3.DynamicColors.DayNight">

  <ImageView
    ...
    app:tint="?attr/colorPrimaryContainer"
    android:src="@drawable/ic_partly_cloudy" />

    <!-- Other widget content. -->

</LinearLayout>
Widget no tema do modo claro
Figura 1. Widget no tema claro.
Widgets no tema do modo escuro
Figura 2. Widget no tema escuro.

Compatibilidade com versões anteriores para cores dinâmicas

As cores dinâmicas estão disponíveis apenas em dispositivos com o Android 12 ou versões mais recentes. Para fornecer um tema personalizado a versões anteriores, crie um tema padrão com suas cores personalizadas e um novo qualificador (values-v31) usando os atributos de tema padrão.

Confira um exemplo que usa o tema Material 3:

/values/styles.xml

<resources>
  <style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight">
    <!-- Override default colorBackground attribute with custom color. -->
    <item name="android:colorBackground">@color/my_background_color</item>

    <!-- Add other colors/attributes. -->

  </style>
</resources>

/values-v31/styles.xml

<resources>
  <!-- Do not override any color attribute. -->
  <style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight" />
</resources>

/layout/my_widget_layout.xml

<resources>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:background="?android:attr/colorBackground"
    android:theme="@style/MyWidgetTheme" />
</resources>

Ativar o suporte por voz

As Ações no app permitem que o Google Assistente mostre widgets em resposta a comandos de voz relevantes do usuário. Ao configurar o widget para responder a intents integradas (BIIs, na sigla em inglês), o app pode mostrar widgets de forma proativa nas superfícies do Google Assistente, como o Android e o Android Auto. Os usuários têm a opção de fixar widgets na tela de início mostrados pelo Google Assistente, incentivando o engajamento futuro.

Por exemplo, é possível configurar o widget de resumo do treino no app de exercícios para atender aos comandos de voz do usuário que acionam a BI GET_EXERCISE_OBSERVATION. O Google Assistente mostra o widget de forma proativa quando os usuários acionam essa BII, fazendo solicitações como "Ok Google, quantos quilômetros eu corri esta semana no ExampleApp?".

Existem dezenas de BIIs que abrangem várias categorias de interação do usuário, permitindo que quase todos os apps Android melhorem os widgets para voz. Para começar, consulte Integrar Ações no app com widgets do Android.

Melhorar a experiência com o seletor de widgets do app

O Android 12 permite melhorar a experiência do seletor de widgets para o app adicionando visualizações e descrições dinâmicas de widgets.

Adicionar visualizações de widgets escalonáveis ao seletor

A partir do Android 12, a visualização do widget exibida no seletor de widgets é escalonável. Você fornece isso como um layout XML definido para o tamanho padrão do widget. Antes, a visualização do widget era um recurso drawable estático, em alguns casos, levando a visualizações que refletiam de forma imprecisa como os widgets aparecem quando eles são adicionados à tela inicial.

Para implementar visualizações de widgets escalonáveis, use o atributo previewLayout do elemento appwidget-provider para fornecer um layout XML:

<appwidget-provider
    android:previewLayout="@layout/my_widget_preview">
</appwidget-provider>

Recomendamos usar o mesmo layout do widget real, com valores padrão ou de teste realistas. A maioria dos apps usa o mesmo previewLayout e initialLayout. Para orientações sobre como criar layouts de visualização precisos, consulte a próxima seção nesta página.

Recomendamos especificar os atributos previewLayout e previewImage para que o app possa voltar a usar previewImage caso o dispositivo do usuário não ofereça suporte a previewLayout. O atributo previewLayout tem precedência sobre o atributo previewImage.

Abordagens recomendadas para criar visualizações precisas

Para implementar visualizações de widgets escalonáveis, use o atributo previewLayout do elemento appwidget-provider para fornecer um layout XML:

<appwidget-provider
    ...
    android:previewLayout="@layout/my_widget_preview">
</appwidget-provider>
Imagem mostrando uma prévia de um widget
Figura 3. Uma visualização de widget que, por padrão, aparece em uma área 3 x 3, mas pode caber em uma área 3 x 1 devido ao layout XML.

Para mostrar uma visualização precisa, forneça diretamente o layout do widget com valores padrão seguindo estas etapas:

  • Configurando android:text="@string/my_widget_item_fake_1" para elementos TextView.

  • Definir uma imagem ou um ícone padrão ou de marcador de posição, como android:src="@drawable/my_widget_icon", para componentes ImageView.

Sem os valores padrão, a visualização pode mostrar valores incorretos ou vazios. Um benefício importante dessa abordagem é que você pode fornecer conteúdo de prévia localizado.

Para conhecer as abordagens recomendadas para visualizações mais complexas que contenham ListView, GridView ou StackView, consulte Criar visualizações precisas que incluam itens dinâmicos para mais detalhes.

Compatibilidade com versões anteriores com visualizações de widgets escalonáveis

Para permitir que os seletores de widgets no Android 11 (nível 30 da API) ou versões anteriores mostrem visualizações do widget, especifique o atributo previewImage.

Se você mudar a aparência do widget, atualize a imagem de visualização.

Adicionar um nome ao widget

Os widgets precisam ter um nome exclusivo quando aparecem no seletor de widgets.

Os nomes dos widgets são carregados do atributo label do elemento receiver do widget no arquivo AndroidManifest.xml.

<receiver
    ….
   android:label="Memories">
     ….
</receiver>

Adicionar uma descrição ao widget

A partir do Android 12, forneça uma descrição para ser exibida pelo seletor de widgets.

Uma imagem mostrando um seletor de widgets e um widget com a descrição
Figura 4. Exemplo de seletor de widget mostrando um widget e a descrição dele.

Forneça uma descrição para o widget usando o atributo description do elemento &lt;appwidget-provider&gt;:

<appwidget-provider
    android:description="@string/my_widget_description">
</appwidget-provider>

É possível usar o atributo descriptionRes em versões anteriores do Android, mas ele é ignorado pelo seletor de widgets.

Ativar transições mais suaves

No Android 12, as telas de início oferecem uma transição mais suave quando um usuário inicia o app de um widget.

Para ativar essa transição melhorada, use @android:id/background ou android.R.id.background para identificar seu elemento de plano de fundo:

// Top-level layout of the widget.
<LinearLayout
    android:id="@android:id/background">
</LinearLayout>

O app pode usar @android:id/background em versões anteriores do Android sem falhas, mas ele é ignorado.

Usar a modificação de RemoteViews durante a execução

A partir do Android 12, é possível aproveitar vários métodos RemoteViews que permitem a modificação dos atributos RemoteViews durante a execução. Consulte a referência da API RemoteViews para conferir a lista completa de métodos adicionados.

O exemplo de código a seguir mostra como usar alguns desses métodos.

Kotlin

// Set the colors of a progress bar at runtime.
remoteView.setColorStateList(R.id.progress, "setProgressTintList", createProgressColorStateList())

// Specify exact sizes for margins.
remoteView.setViewLayoutMargin(R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DP)

Java

// Set the colors of a progress bar at runtime.
remoteView.setColorStateList(R.id.progress, "setProgressTintList", createProgressColorStateList());

// Specify exact sizes for margins.
remoteView.setViewLayoutMargin(R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DP);