【问题标题】:Drop down menu clips/shrinks items Jetpack Compose下拉菜单剪辑/缩小项目 Jetpack Compose
【发布时间】:2021-12-23 12:44:57
【问题描述】:

我正在创建一个下拉菜单,其中的项目包含一个文本元素和一个图标(中间有一个分隔符);但只有第一个文本完全显示。该图标仅在有其他项目占用更多空间时可见。

@Preview(showSystemUi = true)
@Composable
fun MyScreen() {
    Box(Modifier.fillMaxSize(), Alignment.Center) {

        Box() {
            var expanded by remember { mutableStateOf(false) }

            IconButton(onClick = { expanded = !expanded }) {
                Icon(imageVector = Icons.Default.MoreVert, contentDescription = null)
            }

            DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
                MyMenuItem("item 1")           // Icon visible
                MyMenuItem("item 2")           // Icon visible
                MyMenuItem("item 3 long text") // Icon width shrunk to 0
                MyMenuItem("item 4 long te")   // Icon visible but shrunk
            }

        }
    }
}

@Composable
fun MyMenuItem(text: String) {
    DropdownMenuItem(onClick = { }) {
        Text(text)
        Spacer(modifier = Modifier.weight(1f))
        Icon(imageVector = Icons.Default.Check, contentDescription = null) // <-- Icon
    }
}

注意:

  1. 我也尝试使用Row()Surface() 代替DropdownMenuItem(),但结果相似。
  2. MyMenuItem() 作品提供宽度;但我希望它根据内容自动调整大小。

【问题讨论】:

    标签: android kotlin android-jetpack-compose android-jetpack


    【解决方案1】:

    一般来说,要创建这样的布局,您只需将Modifier.weight(1f) 应用于您的Text

    您还需要 Modifier.width(IntrinsicSize.Max) 为您的 Column 使宽度等于最宽的项目,但在您的情况下,它已经内置在 DropdownMenu 中。

    但随后会弹出this bug,这不允许您正确调整MyMenuItem 的大小,其中包含Icon。请加个星号以引起更多关注。

    作为修复此错误之前的临时解决方案,您可以手动指定图标的大小,如下所示:

    // copied from the source code as it's internal
    const val MaterialIconDimension = 24f
    
    @Composable
    fun MyMenuItem(text: String) {
        DropdownMenuItem(
            onClick = { }
        ) {
            Text(text, Modifier.weight(1f))
            Icon(
                imageVector = Icons.Default.Check, 
                contentDescription = null, 
                modifier = Modifier.size(MaterialIconDimension.dp)
            )
        }
    }
    

    结果:

    【讨论】:

    • 昨天我完全按照你说的做了解决了这个问题。但我不知道IntrinsicSize 错误。谢谢你让我知道!在修复错误之前可能对其他人有用。
    • Modifier.weight(1f) 是唯一对我有用的东西。我花了几个小时寻找这个解决方案!
    猜你喜欢
    • 2021-07-10
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多