Compose中Dialog内点击ImeAction.Done无法隐藏键盘的解决方法
解决方案:Dialog内BasicTextField点击Done无法关闭软键盘
问题根源
你在Dialog外部获取LocalSoftwareKeyboardController和LocalFocusManager,但Dialog属于独立的Compose组合树,外部获取的实例无法正确控制Dialog内部的焦点与键盘状态。
修复步骤
- 将
LocalSoftwareKeyboardController和LocalFocusManager的获取移至Dialog内部的Composable层级中 - 在
onDone回调中先清除输入框焦点,再隐藏软键盘,双重保障避免失效
修复后的完整代码
@Composable fun DialogEditNickNameView(){ val name = remember { mutableStateOf("") } Dialog(onDismissRequest = { }) { // 移到Dialog内部获取控制器 val keyboardController = LocalSoftwareKeyboardController.current val focusManager = LocalFocusManager.current Column( modifier = Modifier .background(color = Color.White, shape = RoundedCornerShape(16.dp)) .padding(vertical = 24.dp, horizontal = 16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Text( text = "Edit name", style = TextStyle( fontFamily = robotoFamily, fontWeight = FontWeight.Medium, fontSize = 16.sp, lineHeight = 24.sp, color = colorResource(id = R.color.text_color) ), ) Row( modifier = Modifier.padding(vertical = 16.dp) ) { BasicTextField( value = name.value, onValueChange = { name.value = it }, modifier = Modifier.fillMaxWidth(0.7f), keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Text, imeAction = ImeAction.Done ), keyboardActions = KeyboardActions(onDone = { // 先清除焦点,再隐藏键盘 focusManager.clearFocus() keyboardController?.hide() }), singleLine = true, textStyle = TextStyle( fontFamily = robotoFamily, fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 24.sp, color = colorResource(id = R.color.text_color) ), ) Spacer(modifier = Modifier.width(26.dp)) Image( painter = painterResource(id = R.drawable.ic_close_circle), contentDescription = "Clear input", modifier = Modifier.clickable { name.value = "" } ) } } }
额外补充
如果上述方案仍有失效情况,可尝试给BasicTextField绑定焦点请求器,强制释放焦点:
// 在Dialog内部添加 val focusRequester = remember { FocusRequester() } // 修改BasicTextField的modifier BasicTextField( modifier = Modifier .fillMaxWidth(0.7f) .focusRequester(focusRequester), // 其他参数不变 ) // 在onDone回调中添加 focusRequester.freeFocus()
内容的提问来源于stack exchange,提问作者AnTran
相关产品推荐
相关产品推荐

