Améliorer votre widget

Cette page fournit des informations sur les améliorations facultatives de widget disponibles à partir d'Android 12 (niveau d'API 31). Ces fonctionnalités sont facultatives, mais il est facile d'implémenter et d'améliorer l'expérience utilisateur des widgets.

Utiliser des couleurs dynamiques

À partir d'Android 12, un widget peut utiliser les couleurs du thème de l'appareil pour les boutons, les arrière-plans et d'autres composants. Cela permet des transitions plus fluides et une cohérence entre les différents widgets.

Il existe deux façons d'obtenir des couleurs dynamiques:

  • Utilisez le thème par défaut du système (@android:style/Theme.DeviceDefault.DayNight) dans la mise en page racine.

  • Utilisez le thème Material 3 (Theme.Material3.DynamicColors.DayNight) de la bibliothèque Material Components for Android (Composants Material pour Android), disponible à partir de la page Composants Material pour Android v1.6.0.

Une fois le thème défini dans la mise en page racine, vous pouvez utiliser des attributs de couleur communs dans la racine ou l'un de ses enfants pour récupérer les couleurs dynamiques.

Voici quelques exemples d'attributs de couleur que vous pouvez utiliser:

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

Dans l'exemple suivant utilisant le thème Material 3, la couleur du thème de l'appareil est "violet". La couleur d'accentuation et l'arrière-plan du widget s'adaptent aux modes clair et sombre, comme illustré dans les figures 1 et 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 avec le thème en mode clair
Figure 1. Widget avec le thème clair.
Widgets avec le thème en mode sombre
Figure 2 : Widget avec thème sombre.

Rétrocompatibilité pour les couleurs dynamiques

Les couleurs dynamiques ne sont disponibles que sur les appareils équipés d'Android 12 ou version ultérieure. Pour fournir un thème personnalisé pour les versions antérieures, créez un thème par défaut avec vos couleurs personnalisées et un nouveau qualificatif (values-v31) à l'aide des attributs de thème par défaut.

Voici un exemple utilisant le thème 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>

Activer la compatibilité vocale

Les actions dans les applications permettent à l'Assistant Google d'afficher les widgets en réponse aux commandes vocales pertinentes de l'utilisateur. En configurant votre widget pour qu'il réponde aux intents intégrés, votre application peut afficher de manière proactive des widgets sur des surfaces de l'Assistant telles qu'Android et Android Auto. Les utilisateurs ont la possibilité d'épingler les widgets affichés par l'Assistant à leur lanceur d'applications, ce qui favorise l'engagement futur.

Par exemple, vous pouvez configurer le widget de résumé de l'entraînement pour que votre application d'exercice exécute les commandes vocales de l'utilisateur qui déclenchent l'intent intégré GET_EXERCISE_OBSERVATION. L'Assistant affiche de manière proactive votre widget lorsque les utilisateurs déclenchent cet intent intégré en effectuant des requêtes telles que "Hey Google, combien de kilomètres ai-je parcourus cette semaine sur l'appli XXX ?"

Il existe des dizaines d'intents intégrés couvrant plusieurs catégories d'interaction utilisateur, ce qui permet à presque toutes les applications Android d'améliorer leurs widgets pour la voix. Pour commencer, consultez Intégrer les actions dans les applications avec les widgets Android.

Améliorer l'expérience de sélection de widgets de votre application

Android 12 vous permet d'améliorer l'expérience de sélection de widgets de votre application en ajoutant des aperçus et des descriptions de widgets dynamiques.

Ajouter des aperçus de widgets évolutifs au sélecteur de widgets

À partir d'Android 12, l'aperçu du widget affiché dans le sélecteur de widgets est évolutif. Vous la fournissez sous la forme d'une mise en page XML définie sur la taille par défaut du widget. Auparavant, l'aperçu du widget était une ressource drawable statique. Dans certains cas, les aperçus reflétaient mal la façon dont les widgets apparaissent lorsqu'ils sont ajoutés à l'écran d'accueil.

Pour implémenter des aperçus de widgets évolutifs, utilisez l'attribut previewLayout de l'élément appwidget-provider afin de fournir une mise en page XML à la place:

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

Nous vous recommandons d'utiliser la même mise en page que celle du widget, avec des valeurs par défaut ou de test réalistes. La plupart des applications utilisent les mêmes previewLayout et initialLayout. Pour obtenir des conseils sur la création de mises en page d'aperçu précises, consultez la section suivante de cette page.

Nous vous recommandons de spécifier les attributs previewLayout et previewImage, afin que votre application puisse utiliser previewImage si l'appareil de l'utilisateur n'est pas compatible avec previewLayout. L'attribut previewLayout est prioritaire sur l'attribut previewImage.

Approches recommandées pour créer des aperçus précis

Pour implémenter des aperçus de widget évolutifs, utilisez l'attribut previewLayout de l'élément appwidget-provider pour fournir une mise en page XML:

<appwidget-provider
    ...
    android:previewLayout="@layout/my_widget_preview">
</appwidget-provider>
Image montrant l&#39;aperçu d&#39;un widget
Figure 3. Aperçu de widget qui s'affiche par défaut dans une zone de 3 x 3 pixels, mais qui peut tenir dans une zone de 3 x 1 pixels en raison de sa mise en page XML

Pour afficher un aperçu précis, vous pouvez fournir directement la mise en page réelle du widget avec les valeurs par défaut en procédant comme suit:

  • Définition de android:text="@string/my_widget_item_fake_1" pour les éléments TextView

  • Définir une image ou une icône par défaut ou d'espace réservé, telle que android:src="@drawable/my_widget_icon", pour les composants ImageView.

Sans valeurs par défaut, l'aperçu peut afficher des valeurs incorrectes ou vides. L'un des avantages importants de cette approche est que vous pouvez fournir un contenu d'aperçu localisé.

Pour connaître les approches recommandées pour les aperçus plus complexes contenant ListView, GridView ou StackView, consultez Créer des aperçus précis incluant des éléments dynamiques.

Rétrocompatibilité avec les aperçus de widgets évolutifs

Pour autoriser les sélecteurs de widgets sous Android 11 (niveau d'API 30) ou version antérieure à afficher des aperçus de votre widget, spécifiez l'attribut previewImage.

Si vous modifiez l'apparence du widget, mettez à jour l'image d'aperçu.

Ajouter une description pour votre widget

À partir d'Android 12, fournissez une description que le sélecteur de widget affichera pour votre widget.

Image montrant l&#39;outil de sélection de widgets et leur description
Figure 4 : Exemple de sélecteur de widget affichant un widget et sa description

Fournissez une description de votre widget à l'aide de l'attribut description de l'élément &lt;appwidget-provider&gt;:

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

Vous pouvez utiliser l'attribut descriptionRes dans les versions précédentes d'Android, mais il sera ignoré par le sélecteur de widget.

Rendre les transitions plus fluides

À partir d'Android 12, les lanceurs d'applications offrent une transition plus fluide lorsqu'un utilisateur lance votre application à partir d'un widget.

Pour activer cette transition améliorée, utilisez @android:id/background ou android.R.id.background pour identifier votre élément d'arrière-plan:

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

Votre application peut utiliser @android:id/background sur les versions précédentes d'Android sans interruption, mais elle est ignorée.

Utiliser la modification de l'environnement d'exécution des RemoteViews

À partir d'Android 12, vous pouvez exploiter plusieurs méthodes RemoteViews qui permettent de modifier l'environnement d'exécution des attributs RemoteViews. Consultez la documentation de référence de l'API RemoteViews pour obtenir la liste complète des méthodes ajoutées.

L'exemple de code suivant montre comment utiliser certaines de ces méthodes.

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);