我试图在我的撰写应用程序中实现一个搜索栏。我有一个文本字段,当我在文本字段外单击时,我想失去焦点并隐藏键盘。然而,我不知道如何做到这一点。我确实尝试过这样做,我在GitHub上看到了。
然而,我做了一些改变。原来的解决方案使用了这部分代码isHintDisplayed = it != FocusState.Active
,这似乎是不推荐的。所以我把它改为isHintDisplayed = it.isFocused != true
,理论上应该做同样的事情。如果我回到旧版本的compose并使用FocusState.Active,focus/unfocus工作得很好,但我不能让它与我的代码一起工作。
有什么想法吗
下面是我的代码:
@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)
) {
}
}
}
}
这里是Searchbar:
@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
}
)
if(isHintDisplayed) {
Text(
text = hint,
color = Color.LightGray,
modifier = Modifier
.padding(horizontal = 20.dp, vertical = 12.dp)
)
}
}
}
1条答案
按热度按时间ffscu2ro1#
如果你想 * 隐藏键盘 * 和 * 清除焦点 *,你可以通过在TextField中添加KeyboardOptions和KeyboardActions来实现。你可以通过添加任何你想要的ImeAction来实现,例如
ImeAction.Search
。如果你想隐藏键盘 * 外部区域点击 *,那么你可以在你的父组合设置一个 *clickable修饰符 *,并通过一个变量管理键盘显示隐藏状态,该变量的状态将在点击父组合时改变。
如果你想管理键盘显示选项和焦点状态,通过键盘操作和外部区域点击,你可以修改你的代码如下。