简体   繁体   English

DropdownMenu 未与 Dialog 可组合项中文本字段的宽度对齐

[英]DropdownMenu not aligned to width of Textfield in Dialog composable

The DropdownMenu composable is not aligning to the width of the OutlinedTextField which is inside a Dialog composable. DropdownMenu可组合项未与Dialog可组合项内的OutlinedTextField的宽度对齐。 It is shifted slightly to the right.它稍微向右移动。 However, placing the DropdownMenu outside the Dialog composable works fine.但是,将DropdownMenu放在Dialog可组合项之外效果很好。 How can I fix this?我怎样才能解决这个问题?

在此处输入图像描述

DropdownMenu Composable下拉菜单可组合

@Composable
fun MyDropdownMenu() {
    var mExpanded = rememberSaveable { mutableStateOf(false) }
    var mSelectedText = rememberSaveable { mutableStateOf("") }
    var mTextFieldSize = remember { mutableStateOf(Size.Zero) }
    val mCategories = listOf(
        "Produce",
        "Bakery",
        "Meats",
        "Dairy",
        "Deli",
        "Beverages",
        "Frozen"
    )
    val icon = if (mExpanded.value)
        Icons.Filled.KeyboardArrowUp
    else
        Icons.Filled.KeyboardArrowDown
    Column {

        Box {
            OutlinedTextField(
                value = mSelectedText.value,
                readOnly = true,
                onValueChange = { mSelectedText.value = it },
                label = { Text(text = "Category") },
                trailingIcon = {
                    Icon(icon, null,
                        Modifier.clickable { mExpanded.value = !mExpanded.value })
                },
                modifier = Modifier.onGloballyPositioned { coordinates ->
                mTextFieldSize.value = coordinates.size.toSize()
            }.fillMaxWidth(),
            )

            DropdownMenu(
                expanded = mExpanded.value,
                onDismissRequest = { mExpanded.value = false },
                modifier =  Modifier
                      .width(with(LocalDensity.current) { mTextFieldSize.value.width.toDp()})
            ) {
                mCategories.forEach { label ->
                    DropdownMenuItem(onClick = {
                        mSelectedText.value = label
                        mExpanded.value = false
                    }) {
                        Text(text = label)
                    }
                }
            }

        }
    }


}

Dialog Composable对话框可组合

@Composable
fun AddItemDialog(
    onConfirmClicked: () -> Unit,
    onDismiss: () -> Unit,
) {
    Dialog(
        onDismissRequest = onDismiss
    ) {
        Surface(
            shape = MaterialTheme.shapes.medium,
            color = MaterialTheme.colors.surface,
            modifier = Modifier
                .requiredWidth(LocalConfiguration.current.screenWidthDp.dp * 0.96f)
                .padding(4.dp)
        ) {
            Column(
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(top = 16.dp, bottom = 0.dp, start = 16.dp, end = 16.dp)
            ) {
                Text(text = "Add an item", style = MaterialTheme.typography.subtitle1)

                MyDropdownMenu()
                
                Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
                    TextButton(onClick = onDismiss) {
                        Text(text = "Cancel")
                    }
                    TextButton(onClick = onConfirmClicked) {
                        Text(text = "OK")
                    }
                }
            }
        }
    }
}

This bug is related to the fact that you're trying to force Dialog to be bigger than it's expected with Modifier.requiredWidth .此错误与您试图强制 Dialog 比Modifier.requiredWidth预期的更大这一事实有关。 Visually it works, but DropdownMenu uses alert window size to layout, and this size is smaller than your drawn view.视觉上它有效,但DropdownMenu使用 alert window 大小进行布局,并且此大小小于您绘制的视图。

There is actually another way to make the dialog view take up the entire width (except for a small padding) that does not cause this bug:实际上还有另一种方法可以使对话框视图占据整个宽度(小填充除外)不会导致此错误:

Dialog(
    onDismissRequest = {  },
    properties = DialogProperties(usePlatformDefaultWidth = false),
) {

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用 DropdownMenu 可组合禁用文本字段中的直接输入? - How to disable direct input in Textfield with DropdownMenu composable? 从暴露的 dropdownMenu 可组合、jetpack 组合中选择选项时,不会触发文本字段的 onValueChange - onValueChange of textfield is not triggered when selecting an option from exposed dropdownMenu composable, jetpack compose Jetpack Compose - DropdownMenu / Composable 放在 Box 外面 - Jetpack Compose - DropdownMenu / Composable is placed outside (the) Box 如何关闭可组合对话框? - How to dismiss a composable dialog? 将可组合高度调整为与宽度相同 - Resize Composable height to be the same as width 无法计算可组合 TextField 的特定尺寸 - Cannot calculate specific dimensions for composable TextField 计时器未在对话框中对齐为中心 - Timer is not aligned as Center in Dialog 行可组合不占用父级的全部宽度 - Row composable not taking up the full width of parent 如何知道像 TextField 这样的 Composable 何时获得焦点? - How to know when a Composable like TextField gains focus? 从 Jetpack Compose 中的另一个可组合 function 访问 TextField 值 - Access TextField value from another composable function in Jetpack Compose
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM