在我的例子中,我使用OutlinedTextField中的trailingIcon来扩展DropdownMenu。如果使用,请单击结尾的图标-下拉菜单将展开,但OutlinedTextField不会聚焦。此外,使用单击OutlinedTextField时-下拉菜单不会展开,但OutlinedTextField将处于焦点位置。
@Composable
fun DownMenuTextField(
@StringRes titleId: Int,
selectedText: String,
suggestions: List<String>,
onValueChange: (String) -> Unit
) {
var expanded by remember { mutableStateOf(false) }
var textFieldSize by remember { mutableStateOf(Size.Zero) }
val icon = if (expanded) Icons.Filled.ArrowDropUp else Icons.Filled.ArrowDropDown
Column {
OutlinedTextField(
value = selectedText,
readOnly = true,
onValueChange = { onValueChange(it) },
modifier = Modifier
.fillMaxWidth()
.onGloballyPositioned { coordinates ->
textFieldSize = coordinates.size.toSize()
},
label = {
CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
Text(
text = stringResource(titleId),
style = MaterialTheme.typography.body2
)
}
},
trailingIcon = {
Icon(icon, "contentDescription",
Modifier.focusable(false)
.clickable { expanded = !expanded })
}
)
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
modifier = Modifier
.width(with(LocalDensity.current) { textFieldSize.width.toDp() })
) {
suggestions.forEach { label ->
DropdownMenuItem(onClick = {
onValueChange(label)
expanded = false
}) {
Text(text = label)
}
}
}
}
}
点击trailingIcon:
单击OutlinedTextField:
当用户单击trailingIcon或OutlinedTextField时如何操作-始终OutlinedTextField将被聚焦,下拉菜单将被展开
2条答案
按热度按时间kfgdxczn1#
您可以在
TextField
获得焦点后展开下拉菜单,onFocusChanged
修饰符对此很有用。然后在
onDismissRequest
中或选择项目时,可以使用LocalFocusManager
清除焦点。有一句话离题了。我建议你总是使用
modifier
作为最后一个参数:在这种情况下,您不需要在末尾添加逗号,这使得添加新的/删除不必要的修饰符变得更容易结果:
idfiyjo82#
但是我怎样才能编辑这段代码,以便有机会从列表中搜索(在OutinedTextField中)smth呢?