CoordinatorLayout è un ViewGroup che consente layout complessi, sovrapposti e
nidificati. Viene utilizzato come contenitore per attivare interazioni specifiche di Material Design, come l'espansione/il collasso di barre degli strumenti e fogli inferiori, per le visualizzazioni contenute al suo interno.
In Compose, l'equivalente più vicino di un CoordinatorLayout è un
Scaffold. Un Scaffold fornisce slot di contenuti per combinare i componenti Material in pattern e interazioni comuni dello schermo. Questa pagina descrive come
puoi eseguire la migrazione dell'implementazione di CoordinatorLayout per utilizzare Scaffold in
Compose.
Passaggi per la migrazione
Per eseguire la migrazione di CoordinatorLayout a Scaffold, segui questi passaggi:
Nello snippet riportato di seguito,
CoordinatorLayoutcontiene unAppBarLayoutper contenere unToolBar, unViewPagere unFloatingActionButton. Rimuovi il commento relativo aCoordinatorLayoute ai relativi elementi secondari dalla gerarchia della UI e aggiungi unComposeViewper sostituirlo.<!-- <androidx.coordinatorlayout.widget.CoordinatorLayout--> <!-- android:id="@+id/coordinator_layout"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent"--> <!-- android:fitsSystemWindows="true">--> <!-- <androidx.compose.ui.platform.ComposeView--> <!-- android:id="@+id/compose_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent"--> <!-- app:layout_behavior="@string/appbar_scrolling_view_behavior" />--> <!-- <com.google.android.material.appbar.AppBarLayout--> <!-- android:id="@+id/app_bar_layout"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="wrap_content"--> <!-- android:fitsSystemWindows="true"--> <!-- android:theme="@style/Theme.Sunflower.AppBarOverlay">--> <!-- AppBarLayout contents here --> <!-- </com.google.android.material.appbar.AppBarLayout>--> <!-- </androidx.coordinatorlayout.widget.CoordinatorLayout>--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" />Nel frammento o nell'attività, ottieni un riferimento a
ComposeViewche hai appena aggiunto e chiama il metodosetContent. Nel corpo del metodo, imposta unScaffoldcome contenuto:composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> // Scaffold contents // ... } }
Nel contenuto del tuo
Scaffold, aggiungi i contenuti principali dello schermo al suo interno. Poiché i contenuti principali dell'XML riportato sopra sono unViewPager2, utilizzeremo unHorizontalPager, che è l'equivalente di Compose. La lambdacontentdiScaffoldriceve anche un'istanza diPaddingValuesche deve essere applicata alla radice dei contenuti. Puoi utilizzareModifier.paddingper applicare lo stessoPaddingValuesaHorizontalPager.composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> val pagerState = rememberPagerState { 10 } HorizontalPager( state = pagerState, modifier = Modifier.padding(contentPadding) ) { /* Page contents */ } } }
Utilizza altri slot per i contenuti forniti da
Scaffoldper aggiungere altri elementi dello schermo e migrare le visualizzazioni secondarie rimanenti. Puoi utilizzare lo slottopBarper aggiungere unTopAppBare lo slotfloatingActionButtonper fornire unFloatingActionButton.composeView.setContent { Scaffold( Modifier.fillMaxSize(), topBar = { TopAppBar( title = { Text("My App") } ) }, floatingActionButton = { FloatingActionButton( onClick = { /* Handle click */ } ) { Icon( Icons.Filled.Add, contentDescription = "Add Button" ) } } ) { contentPadding -> val pagerState = rememberPagerState { 10 } HorizontalPager( state = pagerState, modifier = Modifier.padding(contentPadding) ) { /* Page contents */ } } }
Casi d'uso comuni
Comprimere ed espandere le barre degli strumenti
Nel sistema di visualizzazione, per comprimere ed espandere la barra degli strumenti con CoordinatorLayout,
utilizzi un AppBarLayout come contenitore per la barra degli strumenti. Puoi quindi specificare un
Behavior tramite layout_behavior in XML nella View scorrevole associata (ad esempio RecyclerView o NestedScrollView) per dichiarare in che modo la barra degli strumenti
si comprime/espande durante lo scorrimento.
In Compose, puoi ottenere un effetto simile tramite un
TopAppBarScrollBehavior. Ad esempio, per implementare una barra degli strumenti comprimibile/espandibile in modo che venga visualizzata quando scorri verso l'alto, segui questi passaggi:
- Chiama
TopAppBarDefaults.enterAlwaysScrollBehavior()per creare unTopAppBarScrollBehavior. - Fornisci il
TopAppBarScrollBehaviorcreato aTopAppBar. Collega
NestedScrollConnectiontramiteModifier.nestedScrollsuScaffoldin modo che lo scaffold possa ricevere eventi di scorrimento nidificati man mano che i contenuti scorrevoli scorrono verso l'alto/il basso. In questo modo, la barra dell'app contenuta può comprimersi/espandersi in modo appropriato durante lo scorrimento dei contenuti.// 1. Create the TopAppBarScrollBehavior val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() Scaffold( topBar = { TopAppBar( title = { Text("My App") }, // 2. Provide scrollBehavior to TopAppBar scrollBehavior = scrollBehavior ) }, // 3. Connect the scrollBehavior.nestedScrollConnection to the Scaffold modifier = Modifier .fillMaxSize() .nestedScroll(scrollBehavior.nestedScrollConnection) ) { contentPadding -> /* Contents */ // ... }
Personalizzare l'effetto di scorrimento di compressione/espansione
Puoi fornire diversi parametri per enterAlwaysScrollBehavior per
personalizzare l'effetto di animazione di compressione/espansione. TopAppBarDefaults fornisce anche altri TopAppBarScrollBehavior, come exitUntilCollapsedScrollBehavior, che espande la barra dell'app solo quando i contenuti vengono scorri fino in fondo.
Per creare un effetto completamente personalizzato (ad esempio, un effetto parallasse), puoi
anche creare il tuo NestedScrollConnection e compensare la barra degli strumenti manualmente
man mano che i contenuti scorrono. Per un esempio di codice, consulta l'esempio di scorrimento nidificato su AOSP.
Cassettiere
Con Views, implementi un riquadro di navigazione utilizzando un
DrawerLayout come visualizzazione principale. A sua volta, il tuo CoordinatorLayout è una
visualizzazione secondaria di DrawerLayout. Il DrawerLayout contiene anche un'altra visualizzazione secondaria, ad esempio un NavigationView, per visualizzare le opzioni di navigazione nel riquadro.
In Compose, puoi implementare un riquadro di navigazione utilizzando il
componibile ModalNavigationDrawer. ModalNavigationDrawer offre uno
slot drawerContent per il cassetto e uno slot content per i contenuti
dello schermo.
ModalNavigationDrawer( drawerContent = { ModalDrawerSheet { Text("Drawer title", modifier = Modifier.padding(16.dp)) HorizontalDivider() NavigationDrawerItem( label = { Text(text = "Drawer Item") }, selected = false, onClick = { /*TODO*/ } ) // ...other drawer items } } ) { Scaffold(Modifier.fillMaxSize()) { contentPadding -> // Scaffold content // ... } }
Per saperne di più, consulta Riquadri.
Snackbar
Scaffold fornisce uno slot snackbarHost, che può accettare un componente SnackbarHost
per visualizzare un Snackbar.
val scope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } Scaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, floatingActionButton = { ExtendedFloatingActionButton( text = { Text("Show snackbar") }, icon = { Icon(Icons.Filled.Image, contentDescription = "") }, onClick = { scope.launch { snackbarHostState.showSnackbar("Snackbar") } } ) } ) { contentPadding -> // Screen content // ... }
Per scoprire di più, consulta Barre di notifica.
Scopri di più
Per saperne di più sulla migrazione di un CoordinatorLayout a Compose, consulta le
seguenti risorse:
- Componenti e layout Material: documentazione sui componenti Material Design supportati in Compose, come
Scaffold. - Migrazione di Sunflower a Jetpack Compose: un post del blog che
documenta il percorso di migrazione da Views a Compose dell'app di esempio Sunflower, che contiene un
CoordinatorLayout.
Consigliati per te
- Nota: il testo del link viene visualizzato quando JavaScript è disattivato
- Componenti e layout di Material
- Rientri della finestra in Scrivi
- Scorrimento