ほとんどのアプリには、アプリのメイン ナビゲーション UI からアクセスできるトップレベルのデスティネーションがいくつかあります。標準的なスマートフォンのディスプレイなど、コンパクトなウィンドウでは、通常、ウィンドウの下部にあるナビゲーション バーにデスティネーションが表示されます。タブレットの全画面表示アプリなど、ウィンドウが拡大されている場合は、デバイスの左右を持ってナビゲーション コントロールに簡単にアクセスできるため、アプリの横にあるナビゲーション レールを使用する方が適しています。
NavigationSuiteScaffold は、WindowSizeClass に基づいて適切なナビゲーション UI コンポーザブルを表示することで、ナビゲーション UI の切り替えを簡素化します。これには、実行時のウィンドウ
サイズ変更中に UI を動的に変更することも含まれます。デフォルトの動作では、次のいずれかの UI コンポーネントが表示されます。
- 幅または高さがコンパクトな場合、またはデバイスがテーブルトップ ポーズの場合: ナビゲーション バー
- 上記以外の場合: ナビゲーション レール
NavigationSuiteScaffold は、コンパクトなウィンドウにナビゲーション
バーを表示します。
NavigationSuiteScaffold は、拡大されたウィンドウにナビゲーション レールを表示します。
依存関係を追加する
NavigationSuiteScaffold は、
Material3 アダプティブ ナビゲーション スイート
ライブラリの一部です。アプリまたはモジュールの build.gradle ファイルにライブラリの依存関係を追加します。
Kotlin
implementation("androidx.compose.material3:material3-adaptive-navigation-suite")
Groovy
implementation 'androidx.compose.material3:material3-adaptive-navigation-suite'
スキャフォールドを作成する
NavigationSuiteScaffold の主な部分は、ナビゲーション スイート アイテムと、選択したデスティネーションのコンテンツです。ナビゲーション
スイート アイテムはコンポーザブルで直接定義できますが、通常は別の場所(enum など)で定義します。
enum class AppDestinations( @StringRes val label: Int, val icon: ImageVector, @StringRes val contentDescription: Int ) { HOME(R.string.home, Icons.Default.Home, R.string.home), FAVORITES(R.string.favorites, Icons.Default.Favorite, R.string.favorites), SHOPPING(R.string.shopping, Icons.Default.ShoppingCart, R.string.shopping), PROFILE(R.string.profile, Icons.Default.AccountBox, R.string.profile), }
NavigationSuiteScaffold を使用するには、現在のデスティネーションを追跡する必要があります。これを行うには、rememberSaveable
を使用します。
var currentDestination by rememberSaveable { mutableStateOf(AppDestinations.HOME) }
次の例では、navigationSuiteItems パラメータ(型
NavigationSuiteScope)は、そのitem 関数
を使用して、個々のデスティネーションのナビゲーション UI を定義します。デスティネーション UI は、ナビゲーション
バー、レール、ドロワーで使用されます。ナビゲーション アイテムを作成するには、AppDestinations
(前のスニペットで定義)をループ処理します。
NavigationSuiteScaffold( navigationSuiteItems = { AppDestinations.entries.forEach { item( icon = { Icon( it.icon, contentDescription = stringResource(it.contentDescription) ) }, label = { Text(stringResource(it.label)) }, selected = it == currentDestination, onClick = { currentDestination = it } ) } } ) { // TODO: Destination content. }
デスティネーション コンテンツ ラムダ内で、currentDestination 値を使用して、表示する UI
を決定します。アプリでナビゲーション
ライブラリを使用している場合は、ここで使用して適切なデスティネーションを表示します。when ステートメントで十分です。
NavigationSuiteScaffold( navigationSuiteItems = { /*...*/ } ) { // Destination content. when (currentDestination) { AppDestinations.HOME -> HomeDestination() AppDestinations.FAVORITES -> FavoritesDestination() AppDestinations.SHOPPING -> ShoppingDestination() AppDestinations.PROFILE -> ProfileDestination() } }
色を変更
NavigationSuiteScaffold は、スキャフォールドが占有する領域全体(通常はウィンドウ全体)に Surface を作成します。さらに、スキャフォールドは、
特定のナビゲーション UI、たとえば NavigationBar を描画します。
サーフェスとナビゲーション UI の両方で、アプリのテーマで指定された値が使用されますが、テーマの値をオーバーライドできます。
containerColor パラメータは、サーフェスの色を指定します。デフォルトは、カラーパターンの背景色です。contentColor
パラメータは、サーフェス上のコンテンツの色を指定します。 デフォルトは、containerColor
に指定された値の「on」の色です。たとえば、containerColor で background 色を使用する場合、contentColor
では onBackground 色を使用します。
カラーシステムの仕組みについて詳しくは、Compose でのマテリアル デザイン 3 のテーマ設定
をご覧ください。これらの値をオーバーライドする場合は、アプリがダークモードとライトモードをサポートするように、テーマで定義された値を使用します。
NavigationSuiteScaffold( navigationSuiteItems = { /* ... */ }, containerColor = MaterialTheme.colorScheme.primary, contentColor = MaterialTheme.colorScheme.onPrimary, ) { // Content... }
ナビゲーション UI は、NavigationSuiteScaffold サーフェスの前面に描画されます。
UI 色のデフォルト値は
NavigationSuiteDefaults.colors()で提供されますが、これらの値もオーバーライドできます。たとえば、ナビゲーション
バーの背景を透明にし、他の値をデフォルトにする場合は、navigationBarContainerColor をオーバーライドします。
NavigationSuiteScaffold( navigationSuiteItems = { /* ... */ }, navigationSuiteColors = NavigationSuiteDefaults.colors( navigationBarContainerColor = Color.Transparent, ) ) { // Content... }
最終的に、ナビゲーション UI の各アイテムをカスタマイズできます。
item 関数を呼び出すときに、
NavigationSuiteItemColors のインスタンスを渡すことができます。このクラスは、ナビゲーション バー、ナビゲーション
レール、ナビゲーション ドロワーのアイテムの色を指定します。つまり、各ナビゲーション UI
タイプで同じ色を使用することも、必要に応じて色を変更することもできます。すべてのアイテムに同じオブジェクト
インスタンスを使用するには、NavigationSuiteScaffold レベルで色を定義し、NavigationSuiteDefaults.itemColors()
関数を呼び出して、変更するアイテムのみをオーバーライドします。
val myNavigationSuiteItemColors = NavigationSuiteDefaults.itemColors( navigationBarItemColors = NavigationBarItemDefaults.colors( indicatorColor = MaterialTheme.colorScheme.primaryContainer, selectedIconColor = MaterialTheme.colorScheme.onPrimaryContainer ), ) NavigationSuiteScaffold( navigationSuiteItems = { AppDestinations.entries.forEach { item( icon = { Icon( it.icon, contentDescription = stringResource(it.contentDescription) ) }, label = { Text(stringResource(it.label)) }, selected = it == currentDestination, onClick = { currentDestination = it }, colors = myNavigationSuiteItemColors, ) } }, ) { // Content... }
ナビゲーション タイプをカスタマイズする
NavigationSuiteScaffold のデフォルトの動作では、ナビゲーション UI
ウィンドウ サイズクラスに基づいて変更されます。ただし、この動作をオーバーライドすることもできます。たとえば、アプリでフィードのコンテンツの大きなペインが 1 つ表示される場合、アプリは拡大されたウィンドウに永続的なナビゲーション ドロワーを使用できますが、コンパクトなウィンドウと中程度のウィンドウ サイズクラスではデフォルトの動作に戻ります。
val adaptiveInfo = currentWindowAdaptiveInfo() val customNavSuiteType = with(adaptiveInfo) { if (windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_EXPANDED_LOWER_BOUND)) { NavigationSuiteType.NavigationDrawer } else { NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(adaptiveInfo) } } NavigationSuiteScaffold( navigationSuiteItems = { /* ... */ }, layoutType = customNavSuiteType, ) { // Content... }
参考情報
マテリアル デザインのガイダンス:
androidx.compose.material3ライブラリ コンポーネント: