ナビゲーション ドロワー コンポーネントは、ユーザーがアプリのさまざまなセクションに移動できるようにするスライドイン メニューです。ユーザーは、横からスワイプするか、メニューアイコンをタップしてアクティブにできます。
ナビゲーション ドロワーを実装する際は、次の 3 つのユースケースを検討してください。
- コンテンツの整理: ニュースアプリやブログアプリなど、ユーザーがさまざまなカテゴリを切り替えられるようにします。
- アカウント管理: ユーザー アカウントを使用するアプリのアカウント設定セクションとプロフィール セクションへのクイックリンクを提供します。
- 機能の検出: 複数の機能と設定を 1 つのメニューに整理して、複雑なアプリでユーザーが機能を見つけてアクセスしやすくします。
マテリアル デザインでは、ナビゲーション ドロワーには次の 2 種類があります。
- 標準: 画面内のスペースを他のコンテンツと共有します。
- モーダル: 画面内の他のコンテンツの上に表示されます。
例
ModalNavigationDrawer
コンポーザブルを使用して、ナビゲーション ドロワーを実装できます。
次の例のように、drawerContent
スロットを使用して ModalDrawerSheet
を指定し、ドロワーのコンテンツを指定します。
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 } } ) { // Screen content }
ModalNavigationDrawer
は他にさまざまなドロワー パラメータを受け入れます。たとえば、次の例のように gesturesEnabled
パラメータで、ドロワーがドラッグに応答するかどうかを切り替えることができます。
ModalNavigationDrawer( drawerContent = { ModalDrawerSheet { // Drawer contents } }, gesturesEnabled = false ) { // Screen content }
動作を制御する
引き出しの開閉方法を制御するには、DrawerState
を使用します。drawerState
パラメータを使用して DrawerState
を ModalNavigationDrawer
に渡す必要があります。
DrawerState
は、現在のドロワーの状態に関連するプロパティだけでなく、open
関数と close
関数へのアクセスを提供します。これらの suspend 関数は CoroutineScope
を必要とし、これは rememberCoroutineScope
を使用してインスタンス化できます。UI イベントに応じて停止関数を呼び出すこともできます。
val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() ModalNavigationDrawer( drawerState = drawerState, drawerContent = { ModalDrawerSheet { /* Drawer content */ } }, ) { Scaffold( floatingActionButton = { ExtendedFloatingActionButton( text = { Text("Show drawer") }, icon = { Icon(Icons.Filled.Add, contentDescription = "") }, onClick = { scope.launch { drawerState.apply { if (isClosed) open() else close() } } } ) } ) { contentPadding -> // Screen content } }
ナビゲーション ドロワー内にグループを作成する
次のスニペットは、セクションと分割線を含む詳細なナビゲーション ドロワーを作成する方法を示しています。
@Composable fun DetailedDrawerExample( content: @Composable (PaddingValues) -> Unit ) { val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() ModalNavigationDrawer( drawerContent = { ModalDrawerSheet { Column( modifier = Modifier.padding(horizontal = 16.dp) .verticalScroll(rememberScrollState()) ) { Spacer(Modifier.height(12.dp)) Text("Drawer Title", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleLarge) HorizontalDivider() Text("Section 1", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleMedium) NavigationDrawerItem( label = { Text("Item 1") }, selected = false, onClick = { /* Handle click */ } ) NavigationDrawerItem( label = { Text("Item 2") }, selected = false, onClick = { /* Handle click */ } ) HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) Text("Section 2", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleMedium) NavigationDrawerItem( label = { Text("Settings") }, selected = false, icon = { Icon(Icons.Outlined.Settings, contentDescription = null) }, badge = { Text("20") }, // Placeholder onClick = { /* Handle click */ } ) NavigationDrawerItem( label = { Text("Help and feedback") }, selected = false, icon = { Icon(Icons.AutoMirrored.Outlined.Help, contentDescription = null) }, onClick = { /* Handle click */ }, ) Spacer(Modifier.height(12.dp)) } } }, drawerState = drawerState ) { Scaffold( topBar = { TopAppBar( title = { Text("Navigation Drawer Example") }, navigationIcon = { IconButton(onClick = { scope.launch { if (drawerState.isClosed) { drawerState.open() } else { drawerState.close() } } }) { Icon(Icons.Default.Menu, contentDescription = "Menu") } } ) } ) { innerPadding -> content(innerPadding) } } }
コードに関する主なポイント
- セクション、分割線、ナビゲーション アイテムを含む
Column
をdrawerContent
に入力します。 ModalDrawerSheet
は、ドロワーにマテリアル デザインのスタイル設定を提供します。HorizontalDivider
: 引き出し内のセクションを区切ります。ModalNavigationDrawer
は引き出しを作成します。drawerContent
は、ドロワーのコンテンツを定義します。ModalDrawerSheet
内で、Column
が引き出し要素を垂直方向に配置します。NavigationDrawerItem
コンポーザブルは、引き出し内の個々のアイテムを表します。Scaffold
は、TopAppBar
など、画面の基本構造を提供します。TopAppBar
のnavigationIcon
は、引き出しの開閉状態を制御します。
結果
次の画像は、開いたときにセクションとアイテムが表示されたドロワーを示しています。
参考情報
- マテリアル デザイン: ナビゲーション ドロワー