1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Jetpack ComposeでTabにバッジをつける方法

Posted at

今回はJetpack ComposeでTabにバッジをつける方法です

未読のお知らせ等があるときにタブにバッジを表示させたいことがあると思います。

実装方法です。

androidx.compose.materialの導入

androidx.compose.material
を導入します。

dependencies {
  implementation "androidx.compose.material:material:${latest.version}"
}

androidx.compose.materialを導入するとBadgedBoxBadgeを使用することができ、こちらを使用してバッジを実装していきます。

バッジの実装

表示するタブのアイコンと、表示するテキストのデータを作っておきます。

Screen.kt
val tabData = listOf(
    "ホーム" to Icons.Filled.Home,
    "カート" to Icons.Filled.ShoppingCart,
    "お知らせ" to Icons.Filled.Notifications,
)

タブ部分の実装の箇所だけ切り抜いてます。

Screen.kt
TabRow(selectedTabIndex = tabIndex,
    modifier = Modifier.fillMaxWidth(),
    backgroundColor = Color.White) {
    tabData.forEachIndexed { index, pair ->
        Tab(selected = tabIndex == index, onClick = {
            coroutineScope.launch {
                pagerState.animateScrollToPage(index)
            }
        }, text = {
            Text(text = pair.first)
        }, icon = {
            BadgedBox(badge = { Badge { Text("1") } }) {
                Icon(
                    pair.second,
                    contentDescription = pair.first
                )
            }
        })
    }
}

こちらで実行するとこのようになるはずです。

スクリーンショット 2022-09-11 15.15.51.png

アイコンを使用しない場合

アイコンを使用しない場合は、このように実装するとできます。

Screen.kt
Tab(selected = tabIndex == index, onClick = {
    coroutineScope.launch {
        pagerState.animateScrollToPage(index)
    }
}, icon = {
    BadgedBox(badge = { Badge { Text("1") } }) {
        Text(text = pair.first)
    }
})

スクリーンショット 2022-09-11 15.20.19.png

バッジの中の文字数が増えた時

ここまで見るとお分かりだと思いますが、Badge { Text("1") } でバッジの中の数字が表示されています。

ではバッジの中の数字が増えると、どうなのででしょうか?

スクリーンショット 2022-09-11 15.22.22.png
このように横幅が広がってくれます。

テキストを無くしたい場合

Screen.kt
Tab(selected = tabIndex == index, onClick = {
    coroutineScope.launch {
        pagerState.animateScrollToPage(index)
    }
}, icon = {
    BadgedBox(badge = { Badge {} }) {
        Text(text = pair.first)
    }
})

テキストを無くすと、丸いバッジのみになります。

スクリーンショット 2022-09-11 15.26.10.png

バッジのサイズの変更

バッジのサイズが大きいなぁー、と思ってませんか?サイズも調整できます。

Screen.kt
Tab(selected = tabIndex == index, onClick = {
    coroutineScope.launch {
        pagerState.animateScrollToPage(index)
    }
}, icon = {
    BadgedBox(badge = { Badge(modifier = Modifier.width(6.dp).height(6.dp)) {}
        Text(text = pair.first)
    }
})

スクリーンショット 2022-09-11 15.29.42.png

ちょうどいい大きさになりましたね!

バッジの位置調整

バッジの位置も調整できます!
今回はわかりやすいように動かしてみました。
offsetを使用します。

Screen.kt
Tab(selected = tabIndex == index, onClick = {
    coroutineScope.launch {
        pagerState.animateScrollToPage(index)
    }
}, icon = {
    BadgedBox(badge = { Badge(modifier = Modifier.width(6.dp).height(6.dp).offset(x = 8.dp, y = (-8).dp)) {} }) {
        Text(text = pair.first)
    }
})

スクリーンショット 2022-09-11 15.35.45.png

このようになります。

以上、Jetpack ComposeでTabにバッジをつける方法でした!

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?