Cette page fournit des informations sur les améliorations de widgets facultatives disponibles à partir d'Android 12 (niveau d'API 31). Ces fonctionnalités sont facultatives, plus facile à implémenter et à améliorer l'expérience utilisateur Widget.
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 les autres composants. Vous bénéficiez ainsi d'une plus grande fluidité les transitions et la cohérence entre les différents widgets.
Il existe deux façons d'obtenir des couleurs dynamiques:
Utiliser 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 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 courants 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 au clair et au foncé les modes opératoires, 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](https://developer.android.com/static/images/appwidgets/example-lightmode.png?authuser=9&hl=fr)
![Widgets avec le thème en mode sombre](https://developer.android.com/static/images/appwidgets/example-darkmode.png?authuser=9&hl=fr)
Rétrocompatibilité pour les couleurs dynamiques
Les couleurs dynamiques ne sont disponibles que sur les appareils équipés d'Android 12
ou supérieur. 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
) qui utilise la valeur par défaut
d'un thème.
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 prise en charge vocale
Les actions dans l'application permettent à l'Assistant Google afficher des widgets en réponse aux commandes vocales pertinentes de l'utilisateur. En configurant pour répondre aux intents intégrés, votre l'application peut afficher les widgets de manière proactive sur des surfaces de l'Assistant comme Android et Android Auto Les utilisateurs ont la possibilité d'épingler les widgets affichés par l'Assistant afin d'encourager les interactions.
Par exemple, vous pouvez configurer le widget de résumé d'entraînement pour votre application d'exercice
pour exécuter les commandes vocales de l'utilisateur qui déclenchent
GET_EXERCISE_OBSERVATION
L'intent intégré. L'Assistant affiche votre widget de manière proactive lorsque les utilisateurs déclenchent cet intent intégré en
en lui demandant par exemple "Hey Google, combien de kilomètres ai-je parcourus cette semaine
Exempled'appli ?"
Il existe des dizaines d'intents intégrés couvrant plusieurs catégories d'interaction utilisateur, permettant à presque toutes les applications Android d'améliorer leurs widgets pour les commandes vocales. Pour commencer, consultez Intégrer les actions dans les applications avec les widgets Android.
Améliorer l'expérience du sélecteur de widgets dans votre application
Android 12 vous permet d'améliorer l'expérience du sélecteur de widgets pour 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 Le sélecteur de widgets est évolutif. Vous devez la fournir sous forme de mise en page XML définie sur le paramètre taille par défaut. Auparavant, l'aperçu du widget était une ressource drawable statique, dans certains cas conduisant à des aperçus reflétant de manière imprécise la façon dont les widgets s'affichent lorsque ils sont ajoutés à l'écran d'accueil.
Pour implémenter des aperçus de widgets évolutifs, utilisez la
previewLayout
de l'élément appwidget-provider
pour 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 le widget proprement dit, avec une valeur par défaut réaliste.
ou des valeurs de test. La plupart des applications utilisent les mêmes previewLayout
et initialLayout
. Pour
pour créer des mises en page d'aperçu précises, consultez la section suivante
.
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
pour l'attribut previewImage
.
Approches recommandées pour créer des aperçus précis
Pour implémenter des aperçus de widgets évolutifs, utilisez l'attribut previewLayout
de
appwidget-provider
pour fournir une mise en page XML:
<appwidget-provider
...
android:previewLayout="@layout/my_widget_preview">
</appwidget-provider>
![Image montrant un aperçu de widget](https://developer.android.com/static/images/appwidgets/todo-list-groceries.png?authuser=9&hl=fr)
Pour afficher un aperçu précis, vous pouvez fournir directement le widget réel avec les valeurs par défaut. Pour ce faire, procédez comme suit:
Définir
android:text="@string/my_widget_item_fake_1"
pourTextView
éléments.Définir une image ou une icône par défaut ou d'espace réservé, par exemple
android:src="@drawable/my_widget_icon"
, pour les composantsImageView
.
Sans valeurs par défaut, l'aperçu peut afficher des valeurs incorrectes ou vides. Une L'avantage majeur de cette approche est que vous pouvez fournir un aperçu localisé contenus.
Pour les approches recommandées pour les aperçus plus complexes contenant ListView
,
GridView
ou StackView
, consultez la section Créer des aperçus précis qui incluent des éléments dynamiques
pour en savoir plus.
Rétrocompatibilité avec les aperçus de widgets évolutifs
Pour permettre aux sélecteurs de widgets sous Android 11 (niveau d'API 30) ou version antérieure d'afficher des aperçus de vos
spécifiez le widget previewImage
.
.
Si vous modifiez l'apparence du widget, mettez à jour l'image d'aperçu.
Ajoutez une description pour votre widget
À partir d'Android 12, fournissez une description du widget sélecteur à afficher pour votre widget.
![Image montrant un sélecteur de widget, ainsi qu'un widget et sa description](https://developer.android.com/static/images/appwidgets/description.png?authuser=9&hl=fr)
Fournissez une description de votre widget à l'aide de l'attribut description
de
Élément <appwidget-provider>
:
<appwidget-provider
android:description="@string/my_widget_description">
</appwidget-provider>
Vous pouvez utiliser
descriptionRes
sur les versions précédentes d'Android, mais il est ignoré par le widget
sélecteur.
Rendre les transitions plus fluides
À partir d'Android 12, les lanceurs d'applications facilitent la transition 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 l'élément d'arrière-plan:
// Top-level layout of the widget.
<LinearLayout
android:id="@android:id/background">
</LinearLayout>
Votre appli peut utiliser @android:id/background
sur les versions précédentes d'Android
sans interruption, mais il est ignoré.
Utiliser la modification de l'environnement d'exécution des RemoteViews
À partir d'Android 12, vous pouvez profiter de plusieurs
Méthodes RemoteViews
permettant de modifier l'environnement d'exécution de RemoteViews
. Voir l'API RemoteViews
pour obtenir la liste complète des méthodes ajoutées.
L'exemple de code suivant montre comment utiliser quelques-unes 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);