下拉菜单未与可组合对话框中文本字段的宽度对齐
DropdownMenu
可组合项未与 Dialog
可组合项内的 OutlinedTextField
的宽度对齐。它稍微向右移动。但是,将 DropdownMenu
放置在 Dialog
可组合项之外可以正常工作。我该如何解决这个问题?
可组合下拉菜单
@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)
}
}
}
}
}
}
可组合对话框
@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")
}
}
}
}
}
}
The DropdownMenu
composable is not aligning to the width of the OutlinedTextField
which is inside a Dialog
composable. It is shifted slightly to the right. However, placing the DropdownMenu
outside the Dialog
composable works fine. 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")
}
}
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
此错误与您尝试使用
Modifier.requiredWidth
强制 Dialog 大于预期有关。从视觉上看它是有效的,但是DropdownMenu
使用警报窗口大小进行布局,并且该大小小于您绘制的视图。实际上还有另一种方法可以使对话框视图占据整个宽度(除了小填充之外),而不会导致此错误:
This bug is related to the fact that you're trying to force Dialog to be bigger than it's expected with
Modifier.requiredWidth
. Visually it works, butDropdownMenu
uses alert window size to layout, and this size is smaller than your drawn view.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: