Jetpack Compose中如何实现点击按钮弹出软键盘
问题根因
直接调用LocalSoftwareKeyboardController.current?.show()无法弹出软键盘,是因为Android系统软键盘唤起的强制前提:界面必须存在已获取焦点的可输入组件。当前示例界面没有TextField这类可接收文本输入的组件,没有合法的输入焦点载体,系统会直接丢弃软键盘唤起请求。
正确实现方案
- 第一步:创建
FocusRequester实例,用于主动给输入组件请求焦点 - 第二步:在界面中添加绑定了该焦点请求器的
TextField:如果业务本身有可见输入框直接用现有组件即可;如果不需要显示输入框,可将输入框尺寸设为0、透明度设为0,完全不影响界面视觉 - 第三步:按钮点击时先让输入框获取焦点,再调用软键盘的show方法
修正后的可运行代码如下:
@OptIn(ExperimentalComposeUiApi::class) @Composable fun MainScreen( viewModel: MainScreenViewModel = hiltViewModel(), ) { val number = viewModel.score.value val keyboardController = LocalSoftwareKeyboardController.current // 创建焦点请求器实例 val focusRequester = remember { FocusRequester() } Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Column(modifier = Modifier.align(Alignment.Center)) { ScoreBoard(number) Spacer(modifier = Modifier.height(12.dp)) Button(onClick = { viewModel.increaseScore(1) }) { Text(text = "Increase Number") } Spacer(modifier = Modifier.height(12.dp)) // 隐藏的输入框,作为软键盘的输入载体 TextField( value = viewModel.inputText.value, onValueChange = { viewModel.updateInput(it) }, modifier = Modifier .focusRequester(focusRequester) .size(0.dp) .alpha(0f), // 隐藏光标 cursorBrush = SolidColor(Color.Transparent) ) Button(onClick = { // 先请求焦点,再唤起软键盘 focusRequester.requestFocus() keyboardController?.show() viewModel.startGame() }) { Text(text = "Start the game") } } } }
注意事项
- 不要在无有效输入焦点组件的场景下直接调用
keyboardController.show(),该调用会被系统直接拦截,无任何响应 - 隐藏输入框不影响文本输入事件的接收,所有用户输入的内容都会正常回调到输入框绑定的状态变量中
- 如果使用Compose BOM 2023.01.00及以上版本,
LocalSoftwareKeyboardController已正式稳定,无需添加@ExperimentalComposeUiApi注解
内容的提问来源于stack exchange,提问作者Hasan Altay
相关产品推荐
相关产品推荐

