[英]Jetpack Compose: Textfield doenst lose focus on click outside of it
我正在尝试在我的 Compose 应用程序中实现搜索栏。 我有一个文本字段,当我在文本字段之外单击时,我想失去焦点并隐藏键盘。 但是,我不知道该怎么做。 我确实尝试过这样做,我在 github 上看到了。
然而,我做了一些改变。 原始解决方案使用这部分代码isHintDisplayed = it.= FocusState Active
似乎已被弃用。 所以我将其更改为isHintDisplayed = it.isFocused = true
理论上应该这样做。 如果我恢复到旧版本的 compose 并使用 FocusState.Active,焦点/取消焦点可以完美地工作,但我无法让它与我的代码一起使用。
有任何想法吗?
这是我的代码:
@Composable
fun ListScreen(
navController: NavController
) {
Surface(
color = MaterialTheme.colors.background,
modifier = Modifier.fillMaxSize()
) {
Column {
Spacer(modifier = Modifier.height(20.dp))
Image(
painter = painterResource(id = R.drawable.ic_international_pok_mon_logo),
contentDescription = "Cards",
modifier = Modifier
.fillMaxWidth()
.align(CenterHorizontally)
)
SearchBar(
hint = "Search",
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
}
}
}
}
这是搜索栏:
@Composable
fun SearchBar(
modifier: Modifier = Modifier,
hint: String = "",
onSearch: (String) -> Unit = {}
) {
var text by remember {
mutableStateOf("")
}
var isHintDisplayed by remember {
mutableStateOf(false)
}
Box(modifier = modifier) {
BasicTextField(
value = text,
onValueChange = {
text = it
onSearch(it)
},
maxLines = 1,
singleLine = true,
textStyle = TextStyle(color = Color.Black),
modifier = Modifier
.fillMaxWidth()
.shadow(5.dp, CircleShape)
.background(Color.White, CircleShape)
.padding(horizontal = 20.dp, vertical = 12.dp)
.onFocusChanged {
isHintDisplayed = it.isFocused != true
}
)
if(isHintDisplayed) {
Text(
text = hint,
color = Color.LightGray,
modifier = Modifier
.padding(horizontal = 20.dp, vertical = 12.dp)
)
}
}
}
如果要隐藏键盘并清除焦点,可以通过在 TextField 中添加KeyboardOptions和KeyboardActions来实现。 您可以通过添加任何您想要的ImeAction来做到这一点,例如ImeAction.Search
。
如果要在外部区域单击隐藏键盘,则可以在父可组合中设置可单击修饰符,并通过变量管理键盘显示隐藏 state,其中 state 将在单击父可组合时更改。
如果你想管理键盘显示选项和焦点 state,通过键盘动作和外部区域点击,你可以修改你的代码如下。
@Composable
fun ListScreen() {
Surface(
color = MaterialTheme.colors.background,
modifier = Modifier.fillMaxSize()
) {
var hideKeyboard by remember { mutableStateOf(false) }
Column(modifier = Modifier.clickable { hideKeyboard = true }) {
Spacer(modifier = Modifier.height(20.dp))
Image(
painter = painterResource(id = R.drawable.ic_launcher_foreground),
contentDescription = "Cards",
modifier = Modifier
.fillMaxWidth()
.align(CenterHorizontally)
)
SearchBar(
hint = "Search",
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
hideKeyboard = hideKeyboard,
onFocusClear = { hideKeyboard = false }
) {
}
}
}
}
@Composable
fun SearchBar(
modifier: Modifier = Modifier,
hint: String = "",
hideKeyboard: Boolean = false,
onFocusClear: () -> Unit = {},
onSearch: (String) -> Unit = {}
) {
var text by remember {
mutableStateOf("")
}
var isHintDisplayed by remember {
mutableStateOf(false)
}
val focusManager = LocalFocusManager.current
Box(modifier = modifier.background(color = Color.Red)) {
BasicTextField(
value = text,
onValueChange = {
text = it
onSearch(it)
},
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
keyboardActions = KeyboardActions(onSearch = {
focusManager.clearFocus()
onSearch(text)
}),
maxLines = 1,
singleLine = true,
textStyle = TextStyle(color = Color.Black),
modifier = Modifier
.fillMaxWidth()
.shadow(5.dp, CircleShape)
.background(Color.White, CircleShape)
.padding(horizontal = 20.dp, vertical = 12.dp)
.onFocusChanged {
isHintDisplayed = it.hasFocus != true
}
)
if(isHintDisplayed) {
Text(
text = hint,
color = Color.LightGray,
modifier = Modifier
.padding(horizontal = 20.dp, vertical = 12.dp)
)
}
}
if (hideKeyboard) {
focusManager.clearFocus()
// Call onFocusClear to reset hideKeyboard state to false
onFocusClear()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.