CoordinatorLayout
是 ViewGroup
,可啟用複雜、重疊和巢狀的版面配置。它可做為容器,為其中包含的 View 啟用特定 Material Design 互動,例如展開/收合工具列和底部功能表。
在 Compose 中,最接近的 CoordinatorLayout
為
Scaffold
。Scaffold
提供用於合併 Material 的內容版位
將元件轉換為常見的螢幕模式和互動。本頁面說明如何將 CoordinatorLayout
實作項目遷移至 Compose 中的 Scaffold
。
遷移步驟
如要將 CoordinatorLayout
遷移至 Scaffold
,請按照下列步驟操作:
在下列程式碼片段中,
CoordinatorLayout
包含AppBarLayout
,用於包含ToolBar
、ViewPager
和FloatingActionButton
。從 UI 階層中註解CoordinatorLayout
及其子項,並新增ComposeView
取代它。<!-- <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" />
在 Fragment 或 Activity 中,取得對剛新增的
ComposeView
的參照,並在其上呼叫setContent
方法。在方法主體中 將Scaffold
設為內容:composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> // Scaffold contents // ... } }
在「
Scaffold
」的內容中新增螢幕的主要內容 基礎架構由於上述 XML 中的主要內容是ViewPager2
,因此我們將使用HorizontalPager
,相當於 Compose。Scaffold
的content
lambda 也會接收應套用至內容根層級的PaddingValues
例項。您可以使用Modifier.padding
將相同的PaddingValues
套用至HorizontalPager
。composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> val pagerState = rememberPagerState { 10 } HorizontalPager( state = pagerState, modifier = Modifier.padding(contentPadding) ) { /* Page contents */ } } }
使用
Scaffold
提供的其他內容版位來新增更多螢幕元素 以及遷移剩餘的子檢視畫面您可以使用topBar
位置新增TopAppBar
,並使用floatingActionButton
位置提供FloatingActionButton
。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 */ } } }
常見用途
收合及展開工具列
在 View 系統中,如要使用 CoordinatorLayout
收合和展開工具列,您可以使用 AppBarLayout
做為工具列的容器。之後,您就能指定
在相關聯的可捲動項目中,透過 XML 中的 Behavior
至 layout_behavior
查看 (例如 RecyclerView
或 NestedScrollView
) 以宣告工具列的方式
捲動時收合/展開。
在 Compose 中,您可以透過 TopAppBarScrollBehavior
實現類似效果。舉例來說,如要實作收合/展開式工具列,讓工具列在您向上捲動時顯示,請按照下列步驟操作:
- 呼叫
TopAppBarDefaults.enterAlwaysScrollBehavior()
即可建立TopAppBarScrollBehavior
。 - 將建立的
TopAppBarScrollBehavior
提供給TopAppBar
。 透過
Scaffold
上的Modifier.nestedScroll
連結NestedScrollConnection
,讓 Scaffold 在捲動內容向上/下捲動時,能接收巢狀捲動事件。這樣一來,當內容捲動時,內含的應用程式列就能適當地收合/展開。// 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 */ // ... }
自訂收合/展開捲動效果
您可以為 enterAlwaysScrollBehavior
提供多個參數,以自訂收合/展開動畫效果。還有 TopAppBarDefaults
人
提供其他 TopAppBarScrollBehavior
,例如
exitUntilCollapsedScrollBehavior
,只有在出現以下情況時,才會展開應用程式列
捲動瀏覽內容
如要建立完全自訂的效果 (例如視差效果),您可以
您也可以建立自己的 NestedScrollConnection
,並手動調整工具列,如
內容會捲動顯示詳情請參閱 Android 開放原始碼計畫的巢狀捲動範例
做為參考依據
導覽匣
您可以使用 DrawerLayout
做為根檢視區塊,藉此透過 View 實作導覽匣。而您的 CoordinatorLayout
則是 DrawerLayout
的子檢視區塊。DrawerLayout
中也包含另一個子項
檢視畫面 (例如 NavigationView
),即可在
導覽匣。
在 Compose 中,您可以使用
ModalNavigationDrawer
可組合函式。ModalNavigationDrawer
提供
導覽匣 drawerContent
版位,螢幕的 content
版位
內容。
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 // ... } }
詳情請參閱「Drawers」。
Snackbar
Scaffold
提供 snackbarHost
版位,可接受 SnackbarHost
可顯示 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 // ... }
詳情請參閱「Snackbar」。
瞭解詳情
如要進一步瞭解如何將 CoordinatorLayout
遷移至 Compose,請參閱下列資源:
- Material Design 元件和版面配置:Material Design 相關說明文件
Compose 支援的元件,例如
Scaffold
。 - 將 Sunflower 遷移至 Jetpack Compose:這篇網誌文章
記錄了從 View 到 Sunflower 範例的 Compose 遷移過程
,其中包含
CoordinatorLayout
。
為您推薦
- 注意:系統會在 JavaScript 關閉時顯示連結文字
- Material Design 元件和版面配置
- Compose 中的視窗插邊
- 捲動