[英]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.