LoginSignup
4
3

More than 1 year has passed since last update.

Jetpack ComposeのRowで画面の幅に合わせてUIを折り返す(FlowRow)

Posted at

はじめに

Jetpack Composeで開発をしている際に下のようなレイアウトを再現したいと思いました。
iamge
このUIでは、Rowを使用しているのですが、画面の幅がいっぱいになったら折り返して次の行からまたレイアウトしていくという、CSSで言うとflex-box?みたいなのを再現しようとした時に、あんまり記事がなかったので今回書いてみます。

やり方

デフォルトでJetpack ComposeのRowでは、画面の幅以上に要素を並べようとした場合にこのようなUIになります。
スクリーンショット 2022-02-21 17.58.18.png

コードはこんな感じです

@Composable
fun OnBoardScreen() {
    Surface(modifier = Modifier.fillMaxSize()) {
        Text(text = "Demo", style = MaterialTheme.typography.h1)
        Row(
            modifier = Modifier.fillMaxSize(),
            horizontalArrangement = Arrangement.Center,
            verticalAlignment = Alignment.CenterVertically
        ) {
            Card(
                modifier = Modifier.size(150.dp),
                backgroundColor = MaterialTheme.colors.primary
            ) {
                Text(text = "Hello")
            }
            Card(
                modifier = Modifier.size(150.dp),
                backgroundColor = MaterialTheme.colors.secondary
            ) {
                Text(text = "Hello")
            }
            Card(
                modifier = Modifier.size(150.dp),
                backgroundColor = MaterialTheme.colors.error
            ) {
                Text(text = "Hello")
            }
            Card(
                modifier = Modifier.size(150.dp),
                backgroundColor = MaterialTheme.colors.secondaryVariant
            ) {
                Text(text = "Hello")
            }
            Card(
                modifier = Modifier.size(150.dp),
                backgroundColor = MaterialTheme.colors.onSurface
            ) {
                Text(text = "Hello")
            }
        }
    }
}

ごく簡単なコードで、サイズが150.dpCardを5つ表示しています。
しかし、Rowでは、3つ目の半分までしか表示されません。
画面の幅を超えてしまったからですね。

これを画面の幅を超えてしまった場合に折り返すようにするためには、FlowRowを使います。

使い方はシンプルです。
まずは、build.gradleに下記を追加します。

build.gradle
dependencies {
    .....
    implementation "com.google.accompanist:accompanist-flowlayout:0.24.2-alpha"
}

これで、FlowRowが使えるようになりました。
早速使ってみましょう!

MainActivity.kt
// さっきのコードのRowの部分をFlowRowに変える
FlowRow(
            modifier = Modifier.fillMaxSize(),
            mainAxisSpacing = 12.dp,
            mainAxisAlignment = MainAxisAlignment.Center,
            crossAxisSpacing = 5.dp,
        ) {
........
}
  • mainAxisSpacingで、要素間の横のスペースを定義しています。
  • mainAxisAlignmentで、要素を真ん中に寄せています。
  • crossAxisSpacingで、要素間の縦のスペースを定義しています。

UIはこうなります。
スクリーンショット 2022-02-21 18.11.42.png

さっきみたいに画面の外にはみ出さずに、折り返して全ての要素が表示されていますね。
これで、完成です!

最後に

Rowを使って、多くの要素を横並びに表示したいときに、役に立つのでぜひ使ってみてください!

参考

4
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
4
3