CoordinatorLayout ist eine ViewGroup, die komplexe, überlappende und verschachtelte Layouts ermöglicht. Sie wird als Container verwendet, um bestimmte Material Design-Interaktionen wie das Ein- und Ausblenden von Symbolleisten und Bottom Sheets für die darin enthaltenen Ansichten zu ermöglichen.
In Compose ist die nächstgelegene Entsprechung von CoordinatorLayout ein
Scaffold. Scaffold bietet Content-Slots, mit denen Material-Komponenten zu gängigen Bildschirmmustern und Interaktionen kombiniert werden können. Auf dieser Seite wird beschrieben, wie Sie Ihre CoordinatorLayout-Implementierung migrieren können, um Scaffold in Compose zu verwenden.
Migrationsschritte
So migrieren Sie CoordinatorLayout zu Scaffold:
Im Snippet unten enthält
CoordinatorLayouteinAppBarLayoutfür eineToolBar, einenViewPagerund einenFloatingActionButton. Kommentieren SieCoordinatorLayoutund seine untergeordneten Elemente in Ihrer UI-Hierarchie aus und fügen Sie stattdessen eineComposeViewhinzu.<!-- <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" />Rufen Sie in Ihrem Fragment oder Ihrer Aktivität einen Verweis auf die gerade hinzugefügte
ComposeViewab und rufen Sie die MethodesetContentauf. Legen Sie im Textkörper der Methode einScaffoldals Inhalt fest:composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> // Scaffold contents // ... } }
Fügen Sie im Inhalt von
Scaffolddie primären Inhalte des Bildschirms hinzu. Da der primäre Inhalt im obigen XML-Code einViewPager2ist, verwenden wir einenHorizontalPager, der die Compose-Entsprechung dafür ist. Diecontent-Lambda vonScaffolderhält auch eine Instanz vonPaddingValues, die auf das Stammverzeichnis des Inhalts angewendet werden sollte. MitModifier.paddingkönnen Sie dieselbenPaddingValuesaufHorizontalPageranwenden.composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> val pagerState = rememberPagerState { 10 } HorizontalPager( state = pagerState, modifier = Modifier.padding(contentPadding) ) { /* Page contents */ } } }
Verwenden Sie andere Content-Slots, die
Scaffoldbietet, um weitere Bildschirmelemente hinzuzufügen und die verbleibenden untergeordneten Ansichten zu migrieren. Mit dem SlottopBarkönnen Sie einTopAppBarund mit dem SlotfloatingActionButtoneinFloatingActionButtonhinzufügen.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 */ } } }
Gängige Anwendungsfälle
Symbolleisten ein- und ausblenden
Im View-System verwenden Sie AppBarLayout als Container für die Symbolleiste, um die Symbolleiste mit CoordinatorLayout ein- und auszublenden. Anschließend können Sie in XML über layout_behavior in der zugehörigen scrollbaren
Ansicht (z. B. RecyclerView oder NestedScrollView) ein
Behavior angeben, um festzulegen, wie die Symbolleiste
beim Scrollen ein- und ausgeblendet wird.
In Compose können Sie einen ähnlichen Effekt mit einem
TopAppBarScrollBehavior erzielen. So implementieren Sie beispielsweise eine ein- und ausblendbare Symbolleiste, die beim Scrollen nach oben angezeigt wird:
- Rufen Sie
TopAppBarDefaults.enterAlwaysScrollBehavior()auf, um einTopAppBarScrollBehaviorzu erstellen. - Geben Sie das erstellte
TopAppBarScrollBehavioranTopAppBarweiter. Verbinden Sie
NestedScrollConnectionüberModifier.nestedScrollmit demScaffold, damit das Scaffold verschachtelte Scrollereignisse empfangen kann, wenn der scrollbare Inhalt nach oben oder unten gescrollt wird. So kann die enthaltene App-Leiste beim Scrollen des Inhalts entsprechend ein- und ausgeblendet werden.// 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 */ // ... }
Ein- und Ausblenden des Scroll-Effekts anpassen
Sie können mehrere Parameter für enterAlwaysScrollBehavior angeben, um den Animationseffekt für das Ein- und Ausblenden anzupassen. TopAppBarDefaults bietet auch andere TopAppBarScrollBehavior wie exitUntilCollapsedScrollBehavior, die die App-Leiste nur einblenden, wenn der Inhalt ganz nach unten gescrollt wird.
Wenn Sie einen vollständig benutzerdefinierten Effekt erstellen möchten (z. B. einen Parallax-Effekt), können Sie auch eine eigene NestedScrollConnection erstellen und die Symbolleiste beim Scrollen des Inhalts manuell verschieben. Ein
Codebeispiel finden Sie im Beispiel für verschachteltes Scrollen auf AOSP.
Schubladen
Mit Ansichten implementieren Sie eine Navigationsleiste mit
DrawerLayout als Stammansicht. Ihre CoordinatorLayout ist wiederum eine Kinderansicht von DrawerLayout. Das DrawerLayout enthält auch eine weitere untergeordnete
Ansicht, z. B. eine NavigationView, um die Navigationsoptionen in der
Schublade anzuzeigen.
In Compose können Sie eine Navigationsleiste mit der
ModalNavigationDrawer zusammensetzbaren Funktion implementieren. ModalNavigationDrawer bietet einen drawerContent-Slot für die Schublade und einen content-Slot für den Inhalt des Bildschirms.
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 // ... } }
Weitere Informationen finden Sie unter Schubladen.
Snackbars
Scaffold bietet einen snackbarHost-Slot, der eine SnackbarHost
zusammensetzbare Funktion akzeptieren kann, um eine Snackbar anzuzeigen.
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 // ... }
Weitere Informationen finden Sie unter Snackbars.
Weitere Informationen
Weitere Informationen zum Migrieren von CoordinatorLayout zu Compose finden Sie in den folgenden Ressourcen:
- Material-Komponenten und -Layouts: Dokumentation zu Material Design
Komponenten, die in Compose unterstützt werden, z. B.
Scaffold. - Sunflower zu Jetpack Compose migrieren: Ein Blogpost, in dem die Migration der Sunflower-Beispiel
App von Ansichten zu Compose dokumentiert wird. Die App enthält eine
CoordinatorLayout.
Empfehlungen für Sie
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist
- Material-Komponenten und -Layouts
- Fenstereinsätze in Compose
- Scrollen