android - Android Compose 显示和隐藏键盘
问题描述
我有一个可组合的功能TextField
:
val focusManager = LocalFocusManager.current
TextField(
keyboardOptions = KeyboardOptions.Default.copy(
imeAction = ImeAction.Search,
),
keyboardActions = KeyboardActions(
onSearch = {
focusManager.clearFocus()
}
)
)
当我单击不属于可组合内容的其他按钮时,我需要从可组合功能内部和外部显示键盘。基本上我想hideKeyboard()
从我的片段中调用。
我尝试在可组合内使用 livedata:
val shouldShowKeyBoard by shouldShowSearchKeyBoard.observeAsState()
我可以focusManager.clearFocus()
隐藏键盘,但我不确定如何以编程方式显示它以进行特定的撰写TextField
管理隐藏/显示键盘的“撰写”方式是什么?
解决方案
您可以对状态更改执行一些操作,并且可以使用副作用来执行此操作。
例如,您可以使用该LaunchedEffect
功能,其中key
您可以传递一个您想要收听的状态。
LaunchedEffect(booleanValue) {
//...do something
}
您可以使用 ViewModel 设置布尔值,例如:
val focusRequester = FocusRequester()
LaunchedEffect(viewModel.showKeyboard) {
focusRequester.requestFocus()
}
TextField(
value = text,
onValueChange = {
text = it },
modifier = Modifier
// add focusRequester modifier
.focusRequester(focusRequester)
)
请注意:要隐藏键盘,您还可以使用:
val keyboardController = LocalSoftwareKeyboardController.current
TextField(
//...
keyboardActions = KeyboardActions(
onSearch = { keyboardController?.hide() }
)
使用方法focusManager.clearFocus()
关闭键盘并清除焦点。
推荐阅读
- api - Instagram 的 Webhook 在评论广告时是否提供信息?
- c++ - 在定义之前显式实例化模板函数
- javascript - 使用 vainilla JS 获取触发事件的父 DOM 元素的 ID
- javascript - 带有弹出窗口的交互式签到页面
- javascript - 地理位置不适用于移动设备,但适用于我的桌面
- cocoapods - 尝试安装 Pod 时出现错误“with_indifferent_access”
- java - 为什么 super() 构造函数不采用与父构造函数相同的参数?
- pyspark - Dataproc 上 PySpark 中的 BigQuery 连接器 ClassNotFoundException
- security - 使用 SASL 的 Kafka Zookeeper 安全认证和授权 (JAAS)
- reactjs - 为什么当我的包依赖于其他包时出现错误?