Cómo agregar controladores de interacción a los diseños

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

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

NewsApp con interacción de toque

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.

  1. 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.

    El complemento de Figma con la variante hero-item seleccionada
  2. 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ú.

    El complemento de Figma con la variante del ícono de menú seleccionada
  3. 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.

    El complemento de Figma con el controlador de toque seleccionado

Cómo guardar una versión con nombre

Ahora, marquemos esta versión como lista para importarla al código.

  1. 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".

    Opción "Save to version history" en el menú

Cómo actualizar el componente en Android Studio

Ahora, actualicemos el componente NewsCard:

  1. 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.

    Actualiza la opción Paquete de IU en el menú contextual
  2. Haz clic en Botón Make Project para compilar tu proyecto. Esto toma el paquete de IU actualizado y genera una versión actualizada del código que admite composición.

    Botón Build button en la barra de herramientas
  3. 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.

  1. En app/java/com/example/hellonews/ui/home/HomeScreen.kt, desplázate hacia abajo hasta PostListArticleStories, 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(...)
    ...
    
  2. En postTop, agrega controladores para onNewsCardTapped y onMenuTapped. 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))
            ...
        }
    }
    
  3. Por cada publicación, agrega controladores para onNewsCardTapped y onMenuTapped.

    @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))
            }
        }
    }
    
  4. Aún en HomeScreen.kt, desplázate hacia abajo hasta PostListAudioStories, 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(...)
    ...
    
  5. Por cada publicación, agrega controladores para onNewsCardTapped y onMenuTapped. Dado que la variante Audio tiene un menú, también asignamos createOnTapped a onMenuTapped.

    @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))
            }
        }
    }
    
  6. Haz clic en ▶ para compilar la app y ejecutarla en el emulador.

    Botón Run en la barra de herramientas
    App de Noticias en acción en vista previa

    ¡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.