アプリバー

アプリバーは、ユーザーが主要な機能やナビゲーション アイテムにアクセスできるようにするコンテナです。アプリバーには、トップ アプリバーとボトム アプリバーの 2 種類があります。それぞれのデザインと目的は次のとおりです。

タイプ

デザイン

目的

トップ アプリバー

画面の上部全体に表示されます。

主要なタスクや情報にアクセスできます。通常、タイトル、主要なアクション アイテム、特定のナビゲーション アイテムが表示されます。

ボトム アプリバー

画面の下部全体に表示されます。

通常、主要なナビゲーション アイテムが表示されます。フローティング アクション ボタンなど、他の主要なアクションにアクセスできる場合もあります。

トップ アプリバーとボトム アプリバーの例。
図 1.トップ アプリバー(左)とボトム アプリバー(右)。

トップ アプリバーとボトム アプリバーを実装するには、それぞれ TopAppBarBottomAppBar コンポーザブルを使用します。これらのコンポーザブルを使用すると、ナビゲーション コントロールとアクション コントロールをカプセル化し、マテリアル デザインの原則に沿った一貫性のあるインターフェースを作成できます。

トップ アプリバー

次の表に、4 種類のトップ アプリバーの概要を示します。

タイプ

: ナビゲーションやアクションをあまり必要としない画面向け。

小さなトップ アプリバー

中央揃え: 1 つのプライマリ アクションがある画面向け。

中央揃えのトップ アプリバー

: ナビゲーションとアクションを適度に必要とする画面向け。

中サイズのトップ アプリバー

: ナビゲーションとアクションを多く必要とする画面向け。

大きなトップ アプリバー

API サーフェス

4 種類のトップ アプリバーを実装できるさまざまなコンポーザブルは、非常によく似ています。これらのコンポーザブルは、いくつかの重要なパラメータを共有しています。

  • title: アプリバー全体に表示されるテキスト。
  • navigationIcon: ナビゲーションのプライマリ アイコン。アプリバーの左側に表示されます。
  • actions: ユーザーが主要なアクションにアクセスできるアイコン。アプリバーの右側に表示されます。
  • scrollBehavior: Scaffold の内部コンテンツのスクロールに対するトップ アプリバーの反応を決定します。
  • colors: アプリバーの表示方法を決定します。

スクロール動作

ユーザーが指定された Scaffold の内部コンテンツをスクロールしたときに、アプリバーがどのように反応するかを制御できます。これを行うには、 TopAppBarScrollBehavior のインスタンスを作成し、 scrollBehavior パラメータのトップ アプリバーに渡します。

TopAppBarScrollBehavior には 3 種類あります。以下のとおりです。

  • enterAlwaysScrollBehavior: ユーザーが Scaffold の内部コンテンツを引き上げると、トップ アプリバーが折りたたまれます。ユーザーが内部コンテンツを引き下げ始めると、アプリバーが展開されます。
  • exitUntilCollapsedScrollBehavior: enterAlwaysScrollBehavior と似ていますが、アプリバーはユーザーがコンテンツを完全に引き下げた場合にのみ展開されます。
  • pinnedScrollBehavior: アプリバーは元の位置に残り、スクロールに反応しません。

次の例では、これらのオプションのいくつかを実装しています。

以降のセクションでは、4 種類のトップ アプリバーの実装について説明します。スクロール動作を制御する方法のさまざまな例も示します。

小さいトップ アプリバーを作成するには、TopAppBar コンポーザブルを使用します。次の例では、タイトルのみを含む基本的なトップ アプリバーを実装しています。

次の例では、TopAppBarscrollBehavior の値を渡していないため、内部コンテンツのスクロールに反応しません。

@Composable
fun SmallTopAppBarExample() {
    Scaffold(
        topBar = {
            TopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text("Small Top App Bar")
                }
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

これを実装すると次のようになります。

小さいトップ アプリバーの例。
図 2.小さいトップ アプリバー。

中央揃え

中央揃えのトップ アプリバーは、タイトルがコンポーネントの中央に配置されている点を除き、小さいアプリバーと基本的に同じです。これを実装するには、 専用の CenterAlignedTopAppBar コンポーザブルを使用します。

この例では、enterAlwaysScrollBehavior() を使用して、scrollBehavior に渡す値を取得しています。そのため、ユーザーが Scaffold の内部コンテンツをスクロールすると、バーが折りたたまれます。

@Composable
fun CenterAlignedTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),

        topBar = {
            CenterAlignedTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Centered Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior,
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

これを実装すると次のようになります。

中央揃えのトップ アプリバーの例。
図 3.中央揃えのトップ アプリバー。

メディア

中程度のトップ アプリバーでは、追加のアイコンの下にタイトルが配置されます。作成するには、 1 つの MediumTopAppBar コンポーザブルを使用します。

前のスニペットと同様に、この例では enterAlwaysScrollBehavior() を使用して、scrollBehavior に渡す値を取得しています。

@Composable
fun MediumTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            MediumTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Medium Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

これを実装すると次のようになります。enterAlwaysScrollBehavior() のスクロール動作の表示方法を示します。

図 4. ユーザーが上にスクロールすると折りたたまれ、下にスクロールすると展開される中程度のトップ アプリバー。

大きいトップ アプリバーは中程度のアプリバーと似ていますが、タイトルとアイコンの間のパディングが大きく、画面全体でより多くのスペースを占有します。作成するには、 LargeTopAppBar コンポーザブルを使用します。

前のスニペットとは異なり、この例では exitUntilCollapsedScrollBehavior() を使用して、scrollBehavior に渡す値を取得しています。そのため、ユーザーが Scaffold の内部コンテンツをスクロールするとバーが折りたたまれますが、ユーザーが内部コンテンツの末尾までスクロールすると展開されます。

@Composable
fun LargeTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            LargeTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Large Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

これを実装すると次のようになります。

アプリの画面。下部のアプリバーの左側にアクション アイコンが配置され、右側にフローティング アクション ボタンが配置されている。
図 5.大きいトップ アプリバーの実装例。

ボトム アプリバー

ボトム アプリバーを作成するには、BottomAppBar コンポーザブルを使用します。このコンポーザブルの使用方法は、このページの前のセクションで説明したトップ アプリバーのコンポーザブルとよく似ています。次の主要なパラメータにコンポーザブルを渡します。

  • actions: バーの左側に表示される一連のアイコン。通常、特定の画面の主要なアクションまたはナビゲーション アイテムです。
  • floatingActionButton: バーの右側に表示されるフローティング アクション ボタン。

@Composable
fun BottomAppBarExample() {
    Scaffold(
        bottomBar = {
            BottomAppBar(
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(Icons.Filled.Check, contentDescription = "Localized description")
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Edit,
                            contentDescription = "Localized description",
                        )
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Mic,
                            contentDescription = "Localized description",
                        )
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Image,
                            contentDescription = "Localized description",
                        )
                    }
                },
                floatingActionButton = {
                    FloatingActionButton(
                        onClick = { /* do something */ },
                        containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
                        elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
                    ) {
                        Icon(Icons.Filled.Add, "Localized description")
                    }
                }
            )
        },
    ) { innerPadding ->
        Text(
            modifier = Modifier.padding(innerPadding),
            text = "Example of a scaffold with a bottom app bar."
        )
    }
}

これを実装すると次のようになります。

アプリの画面。下部のアプリバーの左側にアクション アイコンが配置され、右側にフローティング アクション ボタンが配置されている。
図 6.ボトム アプリバーの実装例。

参考情報