android - 如何在 Jetpack Compose 中做 Multiline 芯片组?

标签 android kotlin android-jetpack-compose

How to get a layout like this in Jetpack compose?
因此,我创建了一个可组合的 Chip 并在 LazyRow 中使用它,如下所示:

LazyRow(
        modifier = modifier,
        horizontalArrangement = Arrangement.spacedBy(16.dp),
    ){
   items.forEach { it ->
            item {
                CustomChip(
                    item = it,
                    isSelected = it == currentItem,
                    onItemChanged = {
                        onItemChanged(it)
                    }
                )
            }
        }
}
但是,我想获得像上面提到的图像这样的布局。即,如果芯片数量达到屏幕末尾,则新芯片应进入新行。

最佳答案

更新。 现在您可以使用 Accompanist FlowRow :

FlowRow(
    modifier = modifier,
    mainAxisSpacing = 16.dp,
    crossAxisSpacing = 16.dp,
) {
    items.forEach { it ->
        CustomChip(
            item = it,
            isSelected = it == currentItem,
            onItemChanged = {
                onItemChanged(it)
            }
        )
    }
}
原始答案。 如果您有兴趣自己构建类似的东西,您可以使用 Layout :
@Composable
fun ChipVerticalGrid(
    modifier: Modifier = Modifier,
    spacing: Dp,
    content: @Composable () -> Unit
) {
    Layout(
        content = content,
        modifier = modifier
    ) { measurables, constraints ->
        var currentRow = 0
        var currentOrigin = IntOffset.Zero
        val spacingValue = spacing.toPx().toInt()
        val placeables = measurables.map { measurable ->
            val placeable = measurable.measure(constraints)

            if (currentOrigin.x > 0f && currentOrigin.x + placeable.width > constraints.maxWidth) {
                currentRow += 1
                currentOrigin = currentOrigin.copy(x = 0, y = currentOrigin.y + placeable.height + spacingValue)
            }

            placeable to currentOrigin.also {
                currentOrigin = it.copy(x = it.x + placeable.width + spacingValue)
            }
        }

        layout(
            width = constraints.maxWidth,
            height = placeables.lastOrNull()?.run { first.height + second.y } ?: 0
        ) {
            placeables.forEach {
                val (placeable, origin) = it
                placeable.place(origin.x, origin.y)
            }
        }
    }
}
用法:
val words = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
    .split(" ")
ChipVerticalGrid(
    spacing = 7.dp,
    modifier = Modifier
        .padding(7.dp)
) {
    words.forEach { word ->
        Text(
            word,
            modifier = Modifier
                .background(color = Color.Gray, shape = CircleShape)
                .padding(vertical = 3.dp, horizontal = 5.dp)
        )
    }
}
结果:

关于android - 如何在 Jetpack Compose 中做 Multiline 芯片组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68979046/

相关文章:

Android Studio 无法找到显式 Activity 类,尽管类存在

java - Gradle 项目 : java. lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics

android - Jetpack compose mutableStateOf list 在更改列表项类中的属性值时不会触发重新组合

python - 文件 "device/generic/goldfish/tools/mk_combined_img.py",第 48 行打印 "' %s' 无法转换为 int"%(第 [2] 行)

java - Android webview输入类型文件

kotlin - 找不到 Android registerForActivityResult

android - 如何将 viewModel 范围限定为与 NavHost 无关的对话框可组合函数

java - java中int数组的声明与定义分开

android - 从通知栏中删除所有通知

android - 在 Jetpack Compose 中更改光标位置并强制 TextField 的 SingleLine