En esta sección, aprenderemos a agregar interacciones a nuestro diseño a través de controladores de interacción.

Los controladores de interacción proporcionan una forma de especificar el lugar en el que se puede interactuar con un componente (presionar, presionar dos veces, entre otras acciones). Los controladores de interacción se pueden agregar a cualquier capa dentro de un diseño.
Cómo agregar controladores
Los controladores de interacción se pueden agregar a cualquier capa. Esto permite a los diseñadores especificar las partes del componente que son interactivas.
Selecciona la variante hero-item (el marco), haz clic en + junto a Parameter y selecciona
tap-handler
para agregar una controlador de interacción. Esto permite que los desarrolladores escriban código que reacciona cuando un usuario presiona la tarjeta.Repite el paso anterior con la capa del ícono de menú en la variante audio-item. Esto permite a los desarrolladores mostrar un menú cuando un usuario presiona el ícono de menú.
Si seleccionas el controlador on Menu tapped verás que solo se aplica a la variante audio-item porque las otras no tienen un ícono de menú. Sin embargo, on NewsCard tapped se aplica a las tres variantes. Esto significa que puedes proporcionar un controlador (en código) para que se ejecute cuando se presiona cualquiera de las tres variantes, lo que quita la duplicación de código y parámetros. En la sección Cómo actualizar el componente en Android Studio, verás cómo funciona en más detalle.
Cómo guardar una versión con nombre
Ahora, marquemos esta versión como lista para importarla al código.
Agrega una nueva versión con nombre del archivo de Figma. Ve a File > Save to Version History y, luego, ingresa un título y una descripción de tu versión nueva (cualquier título y descripción funcionan aquí).
Ejemplo de título: "Interacciones agregadas"
Ejemplo de descripción: "Se agregaron dos controladores de interacción a las tarjetas".
Cómo actualizar el componente en Android Studio
Ahora, actualicemos el componente NewsCard:
En Android Studio, asegúrate de que la ventana de herramientas Project esté en la vista Android. Luego, haz clic con el botón derecho en
app/ui-packages/news_card/
y, cerca de la parte inferior del menú contextual, haz clic en Update UI Package.Haz clic en
para compilar tu proyecto. Esto toma el paquete de IU actualizado y genera una versión actualizada del código que admite composición.
Si observas
app/java/com/example/hellonews/newscard/NewsCard.kt
, verás que los controladores de interacción se agregan como parámetros a NewsCard (onNewsCardTapped
,onMenuTapped
).// Design to select for NewsCard enum class View { HeroItem, ArticleItem, AudioItem } /** * Displays a summary of a news article. * * This composable was generated from the UI package 'news_card'. * Generated code; do not edit directly */ @Composable fun NewsCard( onNewsCardTapped: () -> Unit = {}, thumbnail: Painter, headline: String, author: String, date: String, onMenuTapped: () -> Unit = {}, modifier: Modifier = Modifier, view: View = View.HeroItem ) { ...
Cómo integrarlo a la app
Ahora, agreguemos algunos controladores a nuestras interacciones.
En
app/java/com/example/hellonews/ui/home/HomeScreen.kt
, desplázate hacia abajo hastaPostListArticleStories
, cerca de la línea 175.... @Composable fun HomeScreen(...) @Composable private fun PostList(...) @Composable private fun PostListArticleStoriesSection(...) @Composable private fun SearchArticlesSection(...) @Composable private fun PostListArticleStories( postTop: Post, posts: List<Post>, createOnTapped: (String, String) -> () -> Unit ) {...} @Composable private fun AudioStoriesTitle(...) @Composable private fun PostListAudioStories(...) @Composable fun Dialog(...) ...
En
postTop
, agrega controladores paraonNewsCardTapped
yonMenuTapped
.createOnTapped
abre un diálogo con sus parámetros como título y cuerpo.@Composable private fun PostListArticleStories( postTop: Post, posts: List<Post>, createOnTapped: (String, String) -> () -> Unit ) { ... Column( horizontalAlignment = Alignment.Start, modifier = ... ) { Spacer(modifier = Modifier.size(12.dp)) NewsCard( thumbnail = painterResource(postTop.imageId), headline = postTop.title, author = postTop.metadata.author.name, date = postTop.metadata.date, onNewsCardTapped = createOnTapped("Card Tapped", postTop.title), onMenuTapped = {}, view = View.HeroItem ) Spacer(modifier = Modifier.size(12.dp)) ... } }
Por cada publicación, agrega controladores para
onNewsCardTapped
yonMenuTapped
.@Composable private fun PostListArticleStories( postTop: Post, posts: List<Post>, createOnTapped: (String, String) -> () -> Unit ) { ... Column( horizontalAlignment = Alignment.Start, modifier = ... ) { ... posts.forEach { post -> NewsCard( thumbnail = painterResource(post.imageId), headline = post.title, author = post.metadata.author.name, date = post.metadata.date, onNewsCardTapped = createOnTapped("Card Tapped", post.title), onMenuTapped = {}, view = View.ArticleItem ) Spacer(modifier = Modifier.size(12.dp)) } } }
Aún en
HomeScreen.kt
, desplázate hacia abajo hastaPostListAudioStories
, cerca de la línea 260.... @Composable fun HomeScreen(...) @Composable private fun PostList(...) @Composable private fun PostListArticleStoriesSection(...) @Composable private fun SearchArticlesSection(...) @Composable private fun PostListArticleStories(...) @Composable private fun AudioStoriesTitle(...) @Composable private fun PostListAudioStories( posts: List<Post>, createOnTapped: (String, String) -> () -> Unit ) {...} @Composable fun Dialog(...) ...
Por cada publicación, agrega controladores para
onNewsCardTapped
yonMenuTapped
. Dado que la variante Audio tiene un menú, también asignamoscreateOnTapped
aonMenuTapped
.@Composable private fun PostListAudioStories( posts: List<Post>, createOnTapped: (String, String) -> () -> Unit ) { Column( horizontalAlignment = ..., modifier = ... ) { posts.forEach { post -> NewsCard( thumbnail = painterResource(post.imageId), headline = post.title, author = post.metadata.author.name, date = post.metadata.date, onNewsCardTapped = createOnTapped("Card Tapped", post.title), onMenuTapped = createOnTapped("Menu Tapped", post.title), view = View.AudioItem ) Spacer(modifier = Modifier.size(12.dp)) } } }
Haz clic en ▶ para compilar la app y ejecutarla en el emulador.
¡Hip, hip, hurra! Aprendiste las funciones avanzadas de Relay.
Si quieres obtener más información para trabajar con Relay, consulta la sección Flujo de trabajo de Relay. También nos gustaría conocer tu opinión si tienes algún comentario.