Lista de redacción / Detalles: Conceptos básicos

En un artículo fresco sobre el estilo de Android, analizamos SlidingPanelLayout
Esto puede simplificar la implementación de la interfaz de adjudicatario «directorio / detalles». Maneja la deducción de mostrar un diseño banda a banda o un diseño de dos páginas según el tamaño de la pantalla. Actualmente, no existe un método equivalente en Jetpack Compose. En este artículo, veremos cómo Compose hace que esto sea relativamente comprensible.
Antaño de profundizar más, vale la pena señalar la palabra «contemporáneo» en el párrafo auténtico. Esta es un ámbito de Compose que se está desarrollando activamente. Por lo tanto, preste mucha atención a la implementación formal de tales funciones. Incluso si esto es solo una posibilidad temporal, todavía presentaremos algunas técnicas interesantes.
Además vale la pena mencionar que proporcionaremos una posibilidad factible al final de este artículo. En muchas situaciones, esto puede estar proporcionadamente. Sin requisa, agregaremos más funciones en el segundo artículo. Esto hará que el dispositivo plegable se comporte mejor.
Relación / Detalles
El comportamiento elemental que queremos seguir es cuando la interfaz de adjudicatario tiene una directorio de nociones. Cuando el adjudicatario hace clic en un sujeto de la directorio, mostraremos la información detallada en la panorama de detalles. En una pantalla más vasto, puede poseer suficiente espacio para mostrar la panorama de directorio y la panorama detallada al mismo tiempo. Sin requisa, en dispositivos más pequeños, tocar un sujeto puede reemplazar la panorama de directorio con la panorama detallada, y luego volverá.
Podemos hacer esto en la antigua interfaz de adjudicatario basada en vistas usando diferentes diseños para diferentes tamaños de pantalla. fresco, SlidingPaneLayout
Puede manejar la pesada carga.
Para hacer esto con Redactar, primero veamos los nociones combinables de Relación y Detalle:
@ Relación de diversión compostable (directorio: Relación
1 2 piezas 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 veintiuno Veintidós | @Se puede combinar Placer Relación(Relación: Relación<Cuerda>, onSelectionChange: (Cuerda) ——> mecanismo) { Columna perezosa() con el fin de (Entrada en Relación) artículo() fila( Modificador .fillMaxWidth() .Clickable onSelectionChange(Entrada) .relleno(horizontal = 16.dp, erecto = 8.dp) ) texto(texto = Entrada)
} @Se puede combinar Placer detalle(texto: Cuerda) texto(texto = texto) |
Los hice deliberadamente lo más simples posible. Esto es para que el código sea comprensible de entender.
List () usa uno LazyColumn
Para mostrar una directorio de nociones proporcionados como parámetro, y la operación de selección es manejada por el parámetro de audición. Detail () solo muestra un fragmento de texto.
Diseño dividido
El diseño dividido (es aseverar, el diseño de banda a banda) es más comprensible de implementar:
@Composable divertido SplitLayout (directorio: Relación
@Se puede combinar Placer SplitLayout(Relación: Relación<Cuerda>) Dónde está Seleccionado a posteriori Recuerda cumplir mutableStateOf(«) fila(Modificador.fillMaxWidth()) caja(Modificador = Modificador.peso(1er pavimento)) Relación(Relación = Relación) newSelection ——> Seleccionado = newSelection
caja(Modificador = Modificador.peso(1er pavimento)) detalle(texto = Seleccionado)
|
Aquí, usamos estado variable para cumplir el texto seleccionado actualmente.
Usamos una visualización banda a banda de componentes List y Detail Row
Aquí utilicé pesos iguales para dividir la pantalla por la parte. Pero cambiar para cumplir con diferentes requisitos será trivial.
Cuando el adjudicatario hace clic en el sujeto de la directorio, el texto se mostrará en el panel derecho:
Diseño de dos páginas
Implementar un diseño de dos páginas es un poco engorroso, porque tenemos que considerar cómo manejar el comportamiento en segundo plano. Utilice Navigation Compose para allanar esta operación.
@Composable funTwoPageLayout (directorio: Relación
1 2 piezas 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 veintiuno Veintidós Veintitres veinticuatro | @Se puede combinar Placer TwoPageLayout(Relación: Relación<Cuerda>) valencia navController = Recuerda NavController() valencia detalleRuta = Planisferio de navegación.ruta.detalle Host de navegación(navController = navController, startDestination = «Relación») Combinable(ruta = Planisferio de navegación.ruta.Relación.ruta) Relación(Relación = Relación) Seleccionado ——> navController.navegación(ruta = detalleRuta.navigationRoute(Seleccionado))
Combinable(ruta = detalleRuta.ruta) Entrada de pila de retorno ——> detalle(texto = backStackEntry.debate?.getString(«Seleccionado») ?: «)
privado propósito Planisferio de navegación sello clase ruta(valencia ruta: Cuerda) propósito Relación : ruta(«Relación») propósito detalle : ruta(«Detalles / selected») Placer Ruta de navegación(Seleccionado: Cuerda) = «Detalles / $ seleccionados»
|
Creamos un NavGraph-List y Detail compuesto por dos objetivos. La ruta de Detalle incluye un parámetro para decantarse una sujeción.
Cuando el adjudicatario hace clic en el sujeto de la directorio, se activa la navegación a la panorama «Detalles», incluido el texto seleccionado como parámetro.Extraemos este valencia del parámetro backStackEntry y lo usamos como Details()
Puede combinarse. La composición de navegación ahora puede manejar el comportamiento de retroceso por nosotros.
Esto da el comportamiento elemental que buscamos:
Para que el código sea simple y comprensible de entender, no incluí animaciones de navegación. Pero esto es verdaderamente poco que quiero sumar cuando verdaderamente lo use.
Disposición dinámica
Ahora que hemos implementado el patrón de comportamiento elemental, necesitamos sumar la deducción de cuándo usar cada comportamiento. En Compose, esto es verdaderamente muy comprensible:
@Composable @Suppress («MagicNumber») divertido DynamicLayout (directorio: Relación
@Se puede combinar @reprimir(«Número mágico») Placer Disposición dinámica( Relación: Relación<Cuerda>, Configuración: Configuración ) en caso (Configuración.MínimoScreenWidthDp < 580) Diseño de página dual(Relación) Otro Diseño dividido(Relación)
|
Una especie Configuration
La instancia se pasa como parámetro y aplicamos una deducción simple. Más delante veremos de dónde viene esto.Si el ufano pequeño de la pantalla es pequeño que 580dp
Y luego emitimos TwoPageLayout
De lo contrario emitimos SplitLayout
.
Esto Configuration
El objeto no es un objeto específico de Compose, es un objeto utilizado por el entorno de papeleo de fortuna para proporcionar fortuna alternativos. Por lo tanto, podemos usarlo casi de la misma guisa que lo hacemos.En este caso, aplicamos la misma deducción que al colocar el diseño. res/layout/sw580
.
Ponlo todo inmediato
Podemos avisar ahora DynamicLayout
Hay dos parámetros: una directorio de cadenas que se mostrarán y Configuration
Ejemplos:
Clase MainActivity: ComponentActivity () override fun onCreate (SavedInstanceState: Bundle?) .10) .map index-> »Item $ index», LocalConfiguration.current)}}}}
1 2 piezas 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 | clase actividades principales : ComponentActivity() { cubrir Placer onCreate(Estado de la instancia guardada: manojo?) { excelente.onCreate(SavedInstanceState) setContent ComposeListDetailTheme superficie(color = Tema material.color.referencias) @reprimir(«Número mágico») Disposición dinámica( (1..10).carta índice ——> «Item $ index» , Configuración circunscrito.Presente )
} } |
Obtenemos la corriente Configuration
Llamando LocalConfiguration.current
.
Los usuarios ahora verán diferentes IU según el tamaño de la ventana.Esto asimismo se aplica a varias ventanas, porque el tamaño de la ventana se extiende 580dp
El linde de ufano de la interfaz de adjudicatario cambiará automáticamente.
en conclusión
Ninguna composición única es particularmente complicada aquí. Esto es principalmente por diseño. Persistir los nociones componibles en una ubicación pequeña y concentrada hace que sean más fáciles de combinar para crear la interfaz de adjudicatario deseada.P.ej DyanmicLayout
Solo relacionado con la deducción emitida por la UI. TwoPageLayout
con SplitLayout
Aceptar la responsabilidad total de sus acciones específicas.
Aunque parece el comportamiento que queremos ahora, no coincide exactamente con las siguientes características: SlidingPaneLayout
En el próximo artículo, estudiaremos cómo usar dispositivos plegables para mejorar este tipo de reproducción.
El código fuente de este artículo está apto aquí.
© 2021, Mark Allison (Mark Allison). reservados todos los derechos.
relacionados
Copyright © 2021 Estilo de Android. reservados todos los derechos.
Para obtener información sobre cómo reutilizar o retornar a difundir este trabajo, visite http://blog.stylingandroid.com/license-information.