【问题标题】:Jetpack compose: possible to set DropdownMenu height to display next itemJetpack compose:可以设置 DropdownMenu 高度以显示下一项
【发布时间】:2021-10-31 16:26:09
【问题描述】:

我在 Jetpack Compose 中使用DropdownMenu,但我遇到了一个问题,即很多用户不明白菜单包含更多信息,因此他们可以滚动列表。我得到了很多支持,他们从列表中遗漏了一些东西。尤其是在某些语言中,它很好地将高度与一个项目对齐,所以你看不到有更多的项目。

有没有办法自动设置下拉菜单的高度(不管是什么语言),让它在底部显示一半的项目,让用户明白他们可以滚动列表?

我使用这些修饰符创建菜单:

DropdownMenu(
    expanded = expanded,
    onDismissRequest = { expanded = false },
    modifier = Modifier.requiredSizeIn(maxHeight = 330.dp)
) {
        items.forEachIndexed { index, item ->
                DropdownMenuItem(onClick = {
                    onSelected(index, item.data)
                    selectedIndex = index
                    expanded = false
                }) {
...
}

【问题讨论】:

    标签: kotlin android-jetpack-compose


    【解决方案1】:

    我同意这是一个不错的功能,我建议您 create 在 Compose 问题跟踪器上提出功能请求。

    现在有一个解决方法,您可以使用 Modifier.onSizeChanged 获取项目高度并像这样更新您的 maxHeight 约束:

    @Composable
    fun TestScreen(
    ) {
        var expanded by remember { mutableStateOf(true) }
        val items = List(10) { it.toString() }
        val itemHeights = remember { mutableStateMapOf<Int, Int>() }
        val baseHeight = 330.dp
        val density = LocalDensity.current
        val maxHeight = remember(itemHeights.toMap()) {
            if (itemHeights.keys.toSet() != items.indices.toSet()) {
                // if we don't have all heights calculated yet, return default value
                return@remember baseHeight
            }
            val baseHeightInt = with(density) { baseHeight.toPx().toInt() }
    
            // top+bottom system padding
            var sum = with(density) { DropdownMenuVerticalPadding.toPx().toInt() } * 2
            for ((i, itemSize) in itemHeights.toSortedMap()) {
                sum += itemSize
                if (sum >= baseHeightInt) {
                    return@remember with(density) { (sum - itemSize / 2).toDp() }
                }
            }
            // all items fit into base height
            baseHeight
        }
    
        DropdownMenu(
            expanded = expanded,
            onDismissRequest = { expanded = false },
            modifier = Modifier.requiredSizeIn(maxHeight = maxHeight)
        ) {
            items.forEachIndexed { index, item ->
                DropdownMenuItem(
                    onClick = {
                        onSelected(index, item.data)
                        selectedIndex = index
                        expanded = false
                    },
                    modifier = Modifier.onSizeChanged {
                        itemHeights[index] = it.height
                    }
                ) {
                    Text("Hello $index", modifier = Modifier.padding(30.dp))
                }
            }
        }
    }
    
    private val DropdownMenuVerticalPadding = 8.dp
    

    附言DropdownMenuVerticalPadding 是取自 source code 的 Material 常量。

    【讨论】:

    • 非常感谢您提供此解决方案!你是救生员!现在支持电子邮件少了很多! :) 我每天都在学习关于 Jetpack compose 的新知识!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多