Glance simplifie la gestion de l'interaction utilisateur à l'aide des classes Action. Les classes Action de Glance définissent les actions qu'un utilisateur peut effectuer, et vous pouvez spécifier l'opération effectuée en réponse à l'action. Vous pouvez appliquer un Action à n'importe quel
composant à l'aide de la méthode GlanceModifier.clickable.
Les widgets d'application résident sur un processus distant. Les actions sont donc définies au moment de la création et l'exécution a lieu dans le processus distant. Dans les RemoteViews natives, cela se fait à l'aide de PendingIntents.
Les actions suivantes sont décrites sur cette page :
Lancer une activité
Pour lancer une activité lors de l'interaction de l'utilisateur, fournissez la
actionStartActivity fonction à un Button ou à un autre composable à l'aide du
GlanceModifier.clickable modificateur.
Fournissez l'un des éléments suivants dans actionStartActivity :
- La classe d'activité cible
- Le
ComponentName - Un intent
Glance traduit l'action en PendingIntent avec la cible et les paramètres fournis. Dans l'exemple suivant, NavigationActivity est lancé lorsqu'un utilisateur clique sur le bouton :
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MyActivity>() ) }
Lancer un service
Comme pour le lancement d'une activité, lancez un service lors de l'interaction de l'utilisateur à l'aide de l'une
des actionStartService méthodes.
Fournissez l'un des éléments suivants dans actionStartService :
- La classe d'activité cible
- Le
ComponentName - Un intent
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
Envoyer un événement de diffusion
Envoyez un événement de diffusion lors de l'interaction de l'utilisateur à l'aide de l'une des
actionSendBroadcast méthodes :
Fournissez l'un des éléments suivants dans actionSendBroadcast :
- Action de chaîne
- Le
ComponentName - Un intent
BroadcastReceiverclasse
@Composable fun MyButton() { // .. Button( text = "Send", onClick = actionSendBroadcast<MyReceiver>() ) }
Effectuer des actions personnalisées
Au lieu de lancer une cible spécifique, Glance peut utiliser une action lambda ou un actionRunCallback pour effectuer une action, comme la mise à jour de l'interface utilisateur ou de l'état lors de l'interaction de l'utilisateur.
Exécuter des actions lambda
Vous pouvez utiliser des fonctions lambda comme rappels pour les interactions de l'interface utilisateur.
Par exemple, transmettez la fonction lambda au modificateur GlanceModifier.clickable :
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
Vous pouvez également la transmettre au paramètre onClick sur les composables qui le prennent en charge :
Button( text = "Submit", onClick = { submitData() } )
Exécuter ActionCallback
Vous pouvez également utiliser les actionRunCallback méthodes pour effectuer une action lors de l'
interaction de l'utilisateur. Pour ce faire, fournissez une implémentation personnalisée de la
ActionCallback :
@Composable private fun MyContent() { // .. Image( provider = ImageProvider(R.drawable.ic_hourglass_animated), modifier = GlanceModifier.clickable( onClick = actionRunCallback<RefreshAction>() ), contentDescription = "Refresh" ) } class RefreshAction : ActionCallback { override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { // TODO implement } }
Lorsque l'utilisateur clique, la méthode suspend onAction du ActionCallback fourni est appelée, ce qui exécute la logique définie (c'est-à-dire la demande d'actualisation des données).
Pour mettre à jour le widget une fois l'action effectuée, créez une instance et
appelez update(..). Pour en savoir plus, consultez la section Gérer l'état de GlanceAppWidget.
class RefreshAction : ActionCallback { override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { // do some work but offset long-term tasks (e.g a Worker) MyAppWidget().update(context, glanceId) } }
Fournir des paramètres aux actions
Pour fournir des informations supplémentaires à une action, utilisez l'ActionParameters
API afin de créer une paire clé-valeur typée. Par exemple, pour définir la destination sur laquelle l'utilisateur a cliqué :
private val destinationKey = ActionParameters.Key<String>( NavigationActivity.KEY_DESTINATION ) class MyAppWidget : GlanceAppWidget() { // .. @Composable private fun MyContent() { // .. Button( text = "Home", onClick = actionStartActivity<NavigationActivity>( actionParametersOf(destinationKey to "home") ) ) Button( text = "Work", onClick = actionStartActivity<NavigationActivity>( actionParametersOf(destinationKey to "work") ) ) } override suspend fun provideGlance(context: Context, id: GlanceId) { provideContent { MyContent() } } }
En dessous, les paramètres sont inclus dans l'intent utilisé pour lancer l'activité, ce qui permet à l'activité cible de les récupérer.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val destination = intent.extras?.getString(KEY_DESTINATION) ?: return // ... } }
Les paramètres sont également fournis au ActionCallback. Utilisez le Parameters.Key défini pour récupérer la valeur :
class RefreshAction : ActionCallback { private val destinationKey = ActionParameters.Key<String>( NavigationActivity.KEY_DESTINATION ) override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { val destination: String = parameters[destinationKey] ?: return // ... } }