輔助窗格版面配置可讓使用者專注於應用程式的主要內容,同時顯示相關的輔助資訊。舉例來說,主窗格可能會顯示電影的詳細資料,而輔助窗格則會列出類似的電影、同一位導演的作品,或是由相同演員演出的作品。
詳情請參閱 Material 3 支援窗格指南。
使用 Scaffold 實作輔助窗格
NavigableSupportingPaneScaffold 可組合函式可簡化在 Jetpack Compose 中實作支援窗格版面配置的程序。這個函式會包裝 SupportingPaneScaffold,並新增內建的導覽和預測返回處理機制。
輔助窗格架構最多可支援三個窗格:
- 主要窗格:顯示主要內容。
- 輔助窗格:提供與主要窗格相關的額外背景資訊或工具。
- 額外窗格 (選用):視需要用於補充內容。
支架會根據視窗大小調整:
- 在大型視窗中,主要窗格和輔助窗格會並排顯示。
在小視窗中,一次只會顯示一個窗格,並隨著使用者瀏覽而切換。
圖 1. 輔助窗格版面配置。
新增依附元件
NavigableSupportingPaneScaffold 是 Material 3 自動調整式版面配置程式庫的一部分。
在應用程式或模組的 build.gradle 檔案中,新增下列三個相關依附元件:
Kotlin
implementation("androidx.compose.material3.adaptive:adaptive")
implementation("androidx.compose.material3.adaptive:adaptive-layout")
implementation("androidx.compose.material3.adaptive:adaptive-navigation")
Groovy
implementation 'androidx.compose.material3.adaptive:adaptive'
implementation 'androidx.compose.material3.adaptive:adaptive-layout'
implementation 'androidx.compose.material3.adaptive:adaptive-navigation'
adaptive-layout:自動調整式版面配置,例如
ListDetailPaneScaffold和SupportingPaneScaffoldadaptive-navigation:用於在窗格內和窗格間導覽的可組合函式,以及預設支援導覽的自動調整式版面配置,例如
NavigableListDetailPaneScaffold和NavigableSupportingPaneScaffold
確認專案包含 compose-material3-adaptive 1.1.0-beta1 以上版本。
選擇啟用預測返回手勢
如要在 Android 15 以下版本中啟用預測返回動畫,您必須選擇支援預測返回手勢。如要選擇採用,請將 android:enableOnBackInvokedCallback="true" 新增至 AndroidManifest.xml 檔案中的 <application> 標記或個別 <activity> 標記。
應用程式指定 Android 16 (API 級別 36) 以上版本後,預測返回功能就會預設為啟用。
建立導覽器
在小型視窗中,一次只會顯示一個窗格,因此請使用 ThreePaneScaffoldNavigator 在窗格之間移動。使用 rememberSupportingPaneScaffoldNavigator 建立導覽器的執行個體。
val scaffoldNavigator = rememberSupportingPaneScaffoldNavigator() val scope = rememberCoroutineScope()
將導覽器傳遞至 Scaffold
Scaffold 需要 ThreePaneScaffoldNavigator,這是代表 Scaffold 狀態的介面、ThreePaneScaffoldValue 和 PaneScaffoldDirective。
NavigableSupportingPaneScaffold( navigator = scaffoldNavigator, mainPane = { /*...*/ }, supportingPane = { /*...*/ }, )
主要窗格和輔助窗格是包含內容的可組合函式。使用 AnimatedPane 在導覽期間套用預設窗格動畫。使用支架值檢查支援窗格是否隱藏,如果是,請顯示呼叫 navigateTo(SupportingPaneScaffoldRole.Supporting) 的按鈕,顯示支援窗格。
以下是 Scaffold 的完整實作:
val scaffoldNavigator = rememberSupportingPaneScaffoldNavigator() val scope = rememberCoroutineScope() NavigableSupportingPaneScaffold( navigator = scaffoldNavigator, mainPane = { AnimatedPane( modifier = Modifier .safeContentPadding() .background(Color.Red) ) { if (scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting] == PaneAdaptedValue.Hidden) { Button( modifier = Modifier .wrapContentSize(), onClick = { scope.launch { scaffoldNavigator.navigateTo(SupportingPaneScaffoldRole.Supporting) } } ) { Text("Show supporting pane") } } else { Text("Supporting pane is shown") } } }, supportingPane = { AnimatedPane(modifier = Modifier.safeContentPadding()) { Text("Supporting pane") } } )
擷取窗格可組合函式
將 SupportingPaneScaffold 的個別窗格擷取至專屬的可組合函式,方便重複使用及測試。如要使用預設動畫,請使用 ThreePaneScaffoldScope 存取 AnimatedPane:
@OptIn(ExperimentalMaterial3AdaptiveApi::class) @Composable fun ThreePaneScaffoldPaneScope.MainPane( shouldShowSupportingPaneButton: Boolean, onNavigateToSupportingPane: () -> Unit, modifier: Modifier = Modifier, ) { AnimatedPane( modifier = modifier.safeContentPadding() ) { // Main pane content if (shouldShowSupportingPaneButton) { Button(onClick = onNavigateToSupportingPane) { Text("Show supporting pane") } } else { Text("Supporting pane is shown") } } } @OptIn(ExperimentalMaterial3AdaptiveApi::class) @Composable fun ThreePaneScaffoldPaneScope.SupportingPane( modifier: Modifier = Modifier, ) { AnimatedPane(modifier = modifier.safeContentPadding()) { // Supporting pane content Text("This is the supporting pane") } }
將窗格擷取至可組合函式,可簡化 SupportingPaneScaffold 的使用方式 (請比較下列內容與上一節中完整實作的 Scaffold):
val scaffoldNavigator = rememberSupportingPaneScaffoldNavigator() val scope = rememberCoroutineScope() NavigableSupportingPaneScaffold( navigator = scaffoldNavigator, mainPane = { MainPane( shouldShowSupportingPaneButton = scaffoldNavigator.scaffoldValue.secondary == PaneAdaptedValue.Hidden, onNavigateToSupportingPane = { scope.launch { scaffoldNavigator.navigateTo(ThreePaneScaffoldRole.Secondary) } } ) }, supportingPane = { SupportingPane() }, )
如要進一步控管 Scaffold 的特定層面,請考慮使用 SupportingPaneScaffold,而非 NavigableSupportingPaneScaffold。這個函式會分別接受 PaneScaffoldDirective 和 ThreePaneScaffoldValue,或 ThreePaneScaffoldState。這項彈性功能可讓您實作窗格間距的自訂邏輯,並決定要同時顯示多少窗格。您也可以新增 ThreePaneScaffoldPredictiveBackHandler,啟用預測返回支援功能。
新增「ThreePaneScaffoldPredictiveBackHandler」
附加預測返回處理常式,該處理常式會採用架構導覽器例項,並指定 backBehavior。這會決定在返回導覽期間,如何從返回堆疊中彈出目的地。然後將 scaffoldDirective 和 scaffoldState 傳遞至 SupportingPaneScaffold。使用接受 ThreePaneScaffoldState 的超載,並傳入 scaffoldNavigator.scaffoldState。
在 SupportingPaneScaffold 中定義主要和輔助窗格。使用 AnimatedPane 進行預設窗格動畫。
完成這些步驟後,您的程式碼應如下所示:
val scaffoldNavigator = rememberSupportingPaneScaffoldNavigator() val scope = rememberCoroutineScope() ThreePaneScaffoldPredictiveBackHandler( navigator = scaffoldNavigator, backBehavior = BackNavigationBehavior.PopUntilScaffoldValueChange ) SupportingPaneScaffold( directive = scaffoldNavigator.scaffoldDirective, scaffoldState = scaffoldNavigator.scaffoldState, mainPane = { MainPane( shouldShowSupportingPaneButton = scaffoldNavigator.scaffoldValue.secondary == PaneAdaptedValue.Hidden, onNavigateToSupportingPane = { scope.launch { scaffoldNavigator.navigateTo(ThreePaneScaffoldRole.Secondary) } } ) }, supportingPane = { SupportingPane() }, )