Cómo obtener una vista previa de tu IU con vistas previas componibles

Una función define un elemento componible y se anota con @Composable:

@Composable
fun SimpleComposable() {
    Text("Hello World")
}

Un elemento de texto simple que
contiene las palabras "Hello World"

Para habilitar una vista previa de este elemento componible, crea otro elemento componible con la anotación @Composable y @Preview. Este nuevo elemento componible con anotaciones ahora contiene el elemento SimpleComposable que creaste inicialmente:

@Preview
@Composable
fun SimpleComposablePreview() {
    SimpleComposable()
}

La anotación @Preview le indica a Android Studio que este elemento componible debe mostrarse en la vista de diseño de este archivo. Puedes ver las actualizaciones en tiempo real de la vista previa del elemento componible a medida que realizas los cambios.

GIF que muestra actualizaciones en tiempo real con la vista previa de Compose

Puedes agregar parámetros de forma manual en tu código para personalizar la forma en que Android Studio renderiza @Preview. Incluso puedes agregar la anotación @Preview a la misma función varias veces para obtener una vista previa de un elemento componible con diferentes propiedades.

Uno de los beneficios principales de usar elementos @Preview componibles es evitar depender del emulador en Android Studio. Puedes guardar el inicio del emulador que requiere mucha memoria para los cambios finales de aspecto y la capacidad de @Preview de realizar y probar pequeños cambios de código con facilidad.

Para aprovechar la anotación @Preview de manera más eficaz, asegúrate de definir tus pantallas en términos del estado que recibe como entrada y los eventos que genera.

Define tu @Preview

Android Studio ofrece algunas funciones para extender vistas previas componibles. Puedes cambiar el diseño de los contenedores, interactuar con ellos o implementarlos directamente en un emulador o dispositivo.

Dimensiones

De forma predeterminada, las dimensiones de @Preview se eligen automáticamente para unir su contenido. Para configurar las dimensiones manualmente, agrega los parámetros heightDp y widthDp. Esos valores ya se interpretan como dp, por lo que no es necesario que les agregues .dp:

@Preview(widthDp = 50, heightDp = 50)
@Composable
fun SquareComposablePreview() {
    Box(Modifier.background(Color.Yellow)) {
        Text("Hello World")
    }
}

Un cuadrado amarillo con las palabras "Hello World"

Vista previa del color dinámico

Si habilitaste el color dinámico en tu app, usa el atributo wallpaper para cambiar de fondo de pantalla y ver cómo reacciona la IU a los diferentes fondos de pantalla que eligieron los usuarios. Selecciona entre los diferentes temas de fondo de pantalla que ofrece la clase Wallpaper. Esta función requiere Compose 1.4.0 o una versión posterior.

Uso con diferentes dispositivos

En Android Studio Flamingo, puedes editar el parámetro device de la anotación de vista previa para definir configuraciones de tus elementos componibles en diferentes dispositivos.

Función de componibilidad de muestra

Cuando el parámetro del dispositivo tiene una cadena vacía (@Preview(device = "")), puedes invocar el autocompletado presionando Ctrl + Space. Luego, puedes establecer los valores de cada parámetro.

La edición de la función de muestra

En Autocompletar, puedes seleccionar cualquier opción de dispositivo de la lista, por ejemplo, @Preview(device = "id:pixel_4"). También puedes ingresar un dispositivo personalizado. Para ello, selecciona spec:width=px,height=px,dpi=int… para establecer los valores individuales de cada parámetro.

Lista de especificaciones

Para aplicar esta opción, presiona Enter o cancela la acción con Esc.

Si configuras un valor no válido, la declaración aparecerá subrayada en rojo y es posible que haya una solución disponible (Alt + Enter (⌥ + ⏎ para macOS) > Replace with .... La inspección intenta proporcionar la solución que se parezca más a tu entrada.

Ejemplo de valor no válido

Configuración regional

Para probar diferentes configuraciones regionales de usuario, agrega el parámetro locale:

@Preview(locale = "fr-rFR")
@Composable
fun DifferentLocaleComposablePreview() {
    Text(text = stringResource(R.string.greeting))
}

Un elemento de texto simple que contiene la palabra "Bonjour" con una bandera francesa

Cómo establecer un color de fondo

De forma predeterminada, el elemento componible se muestra con un fondo transparente. Para agregar un fondo, agrega los parámetros showBackground y backgroundColor. Ten en cuenta que backgroundColor es un Long de ARGB, no un valor Color:

@Preview(showBackground = true, backgroundColor = 0xFF00FF00)
@Composable
fun WithGreenBackground() {
    Text("Hello World")
}

Un rectángulo verde con las palabras "Hello World"

IU del sistema

Si necesitas mostrar barras de estado y de acción dentro de una vista previa, agrega el parámetro showSystemUi:

@Preview(showSystemUi = true)
@Composable
fun DecoratedComposablePreview() {
    Text("Hello World")
}

Una ventana de vista previa que muestra una actividad con el estado y las barras de acciones.

Modo de IU

El parámetro uiMode puede tomar cualquiera de las constantes Configuration.UI_* y te permite cambiar el comportamiento de la vista previa según corresponda. Por ejemplo, puedes configurar la vista previa en Modo nocturno para la reacción del tema.

IU de la vista previa de Compose

LocalInspectionMode

Puedes leer desde el CompositionLocal de LocalInspectionMode para ver si el elemento componible se renderiza en una vista previa (dentro de un componente inspeccionable). Si la composición se renderiza en una vista previa, LocalInspectionMode.current se evalúa como true. Esta información te permite personalizar la vista previa. Por ejemplo, puedes mostrar una imagen de marcador de posición en la ventana de vista previa en lugar de datos reales.

De esta manera, también puedes evitar las limitaciones. (por ejemplo, para mostrar datos de muestra en lugar de llamar a la solicitud de red)

@Composable
fun GreetingScreen(name: String) {
    if (LocalInspectionMode.current) {
        // Show this text in a preview window:
        Text("Hello preview user!")
    } else {
        // Show this text in the app:
        Text("Hello $name!")
    }
}

Interactúa con tu @Preview

Android Studio proporciona funciones que te permiten interactuar con las vistas previas definidas. Esta interacción te ayuda a comprender el comportamiento del tiempo de ejecución de las vistas previas y te permite navegar mejor por la IU con vistas previas.

Modo interactivo

El modo interactivo te permite interactuar con una vista previa de manera similar a como lo harías en un dispositivo que ejecuta tu programa, como un teléfono o una tablet. El modo interactivo está aislado en un entorno de zona de pruebas (es decir, está aislado de otras vistas previas), en el que puedes hacer clic en los elementos y, luego, ingresar entradas del usuario en la vista previa. Es una forma rápida de probar diferentes estados, gestos y hasta animaciones de tu elemento componible.

El usuario hace clic en el botón "interactivo" de la vista previa.

Un video del usuario interactuando
con una vista previa

Navegación por código y esquemas componibles

Puedes desplazarte por sobre una vista previa para ver los contornos del elemento componible que contiene. Cuando haces clic en un esquema componible, se activa la vista de edición para navegar a su definición.

El usuario coloca el cursor sobre una vista previa, lo que hace que Studio muestre los contornos de sus elementos componibles

Ejecutar vista previa

Puedes ejecutar un @Preview específico en un emulador o dispositivo físico. La vista previa se implementa dentro de la misma app del proyecto que una Activity nueva, por lo que comparte el mismo contexto y los mismos permisos. No requiere que escribas código estándar para solicitar un permiso si ya se otorgó.

Haz clic en el ícono Run Preview Ícono Run Preview junto a la anotación @Preview o en la parte superior de la vista previa para que Android Studio implemente ese @Preview en tu emulador o dispositivo conectado.

El usuario hace clic en el botón "Ejecutar vista previa" de la vista previa.

Video del usuario que implementa una vista previa en el dispositivo

Cómo copiar la renderización de @Preview

Se puede copiar cada vista previa renderizada como imagen haciendo clic con el botón derecho en ella.

El usuario hace clic en una vista previa para copiarla como imagen.

Varias vistas previas de la misma anotación @Preview

Puedes mostrar varias versiones del mismo elemento @Preview componible con diferentes especificaciones o diferentes parámetros pasados al elemento. De esta manera, puedes reducir el código estándar que, de otro modo, tendrías que escribir.

Plantillas de vista previa múltiple

androidx.compose.ui:ui-tooling-preview 1.6.0-alpha01+ presenta plantillas de la API de vista previa múltiple: @PreviewScreenSizes, @PreviewFontScales, @PreviewLightDark y @PreviewDynamicColors, de modo que, con una sola anotación, puedes obtener una vista previa de la IU de Compose en situaciones comunes.

Cómo obtener una vista previa de diferentes fuentes y tamaños de pantalla con plantillas

Cómo crear anotaciones de vista previa múltiple personalizadas

Con la vista previa múltiple, puedes definir una clase de anotación que tenga varias anotaciones @Preview con configuraciones diferentes. Si agregas esta anotación a una función de componibilidad, se renderizan automáticamente todas las vistas previas a la vez. Por ejemplo, puedes usar esta anotación para obtener una vista previa de varios dispositivos, tamaños de fuente o temas al mismo tiempo sin repetir esas definiciones para cada elemento componible.

Para comenzar, crea tu propia clase de anotación personalizada:

@Preview(
    name = "small font",
    group = "font scales",
    fontScale = 0.5f
)
@Preview(
    name = "large font",
    group = "font scales",
    fontScale = 1.5f
)
annotation class FontScalePreviews

Puedes usarla para los elementos que admiten composición de la vista previa:

@FontScalePreviews
@Composable
fun HelloWorldPreview() {
    Text("Hello World")
}

Pestaña de diseño de Android Studio que muestra el elemento componible con una fuente pequeña y grande

Puedes combinar varias anotaciones de vista previa múltiple y anotaciones de vista previa normal para crear un conjunto más completo de vistas previas. La combinación de anotaciones de vista previa múltiple no significa que se muestren todas las combinaciones diferentes. En cambio, cada anotación de vista previa múltiple actúa de manera independiente y solo renderiza sus propias variantes.

@Preview(
    name = "Spanish",
    group = "locale",
    locale = "es"
)
@FontScalePreviews
annotation class CombinedPreviews

@CombinedPreviews
@Composable
fun HelloWorldPreview2() {
    MaterialTheme { Surface { Text(stringResource(R.string.hello_world)) } }
}

Pestaña Design de Android Studio que muestra el elemento componible en todas las configuraciones

La naturaleza de combinación de la vista previa múltiple y la vista previa normal te permite probar de manera más completa muchas propiedades de los proyectos a mayor escala.

@Preview y conjuntos de datos grandes

Con frecuencia, surge una necesidad en la que debes pasar un conjunto de datos grande a la vista previa del elemento componible. Para ello, simplemente pasa los datos de muestra a la función de Vista previa que admite composición. Para ello, agrega un parámetro con la anotación @PreviewParameter.

@Preview
@Composable
fun UserProfilePreview(
    @PreviewParameter(UserPreviewParameterProvider::class) user: User
) {
    UserProfile(user)
}

Para proporcionar los datos de muestra, crea una clase que implemente PreviewParameterProvider y muestre los datos de muestra como una secuencia.

class UserPreviewParameterProvider : PreviewParameterProvider<User> {
    override val values = sequenceOf(
        User("Elise"),
        User("Frank"),
        User("Julia")
    )
}

Esto genera una vista previa por elemento de datos en la secuencia:

Vistas previas que muestran elementos componibles de Elise, Frank y Julia

Puedes usar la misma clase de proveedor para varias vistas previas. Si es necesario, limita la cantidad de vistas previas mediante la configuración del parámetro de límite.

@Preview
@Composable
fun UserProfilePreview2(
    @PreviewParameter(UserPreviewParameterProvider::class, limit = 2) user: User
) {
    UserProfile(user)
}

Limitaciones y prácticas recomendadas

Android Studio ejecuta el código de las vistas previas directamente en el área de la vista previa. No es necesario ejecutar un emulador ni un dispositivo físico, ya que aprovecha una parte con portabilidad del framework de Android llamada Layoutlib. Layoutlib es una versión personalizada del framework de Android diseñada para ejecutarse fuera de dispositivos Android. El objetivo de la biblioteca es proporcionar una vista previa de un diseño en Android Studio que esté muy cerca de su renderización en dispositivos.

Limitaciones de las vistas previas

Debido a la forma en que se renderizan las vistas previas en Android Studio, son livianas y no requieren todo el framework de Android para renderizarlas. Sin embargo, esto conlleva las siguientes limitaciones:

  • No tienes acceso a la red.
  • No tienes acceso al archivo.
  • Es posible que algunas APIs de Context no estén completamente disponibles.

Vistas previas y ViewModels

Las vistas previas están limitadas cuando se usa ViewModel dentro de un elemento componible. El sistema de vistas previas no puede construir todos los parámetros que se pasan a un ViewModel, como repositorios, casos de uso, administradores o similares. Además, si tu ViewModel participa en la inserción de dependencias (como con Hilt), el sistema de vistas previas no podrá compilar todo el gráfico de dependencias para construir el ViewModel.

Si intentas obtener una vista previa de un elemento componible con ViewModel, Android Studio muestra un error cuando renderizas ese elemento específico:

Panel de problemas de Android Studio con Error al crear una instancia de un mensaje &quot;ViewModel&quot;

Si deseas obtener una vista previa de un elemento componible que usa un ViewModel, debes crear otro elemento componible con los parámetros de ViewModel pasados como argumentos del elemento componible. De esta manera, no necesitas obtener una vista previa del elemento componible que usa ViewModel.

@Composable
fun AuthorColumn(viewModel: AuthorViewModel = viewModel()) {
  AuthorColumn(
    name = viewModel.authorName,
    // ViewModel sends the network requests and makes posts available as a state
    posts = viewModel.posts
  )
}

@Preview
@Composable
fun AuthorScreenPreview(
  // You can use some sample data to preview your composable without the need to construct the ViewModel
  name: String = sampleAuthor.name,
  posts: List<Post> = samplePosts[sampleAuthor]
) {
  AuthorColumn(...) {
    name = NameLabel(name),
    posts = PostsList(posts)
  }
}

Clase de anotación @Preview

En cualquier momento, puedes presionar la tecla Ctrl o ⌘ + clic en la anotación @Preview en Android Studio para obtener una lista completa de los parámetros que se pueden ajustar cuando se personaliza la vista previa.

annotation class Preview(
    val name: String = "",
    val group: String = "",
    @IntRange(from = 1) val apiLevel: Int = -1,
    val widthDp: Int = -1,
    val heightDp: Int = -1,
    val locale: String = "",
    @FloatRange(from = 0.01) val fontScale: Float = 1f,
    val showSystemUi: Boolean = false,
    val showBackground: Boolean = false,
    val backgroundColor: Long = 0,
    @UiMode val uiMode: Int = 0,
    @Device val device: String = Devices.DEFAULT,
    @Wallpaper val wallpaper: Int = Wallpapers.NONE,
)

Recursos adicionales

Para obtener más información sobre cómo Android Studio promueve la facilidad de uso de @Preview y obtener más sugerencias sobre las herramientas, consulta el blog Herramientas de Compose.