You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compose中Dialog内点击ImeAction.Done无法隐藏键盘的解决方法

解决方案:Dialog内BasicTextField点击Done无法关闭软键盘

问题根源

你在Dialog外部获取LocalSoftwareKeyboardController和LocalFocusManager,但Dialog属于独立的Compose组合树,外部获取的实例无法正确控制Dialog内部的焦点与键盘状态。

修复步骤

  1. 将LocalSoftwareKeyboardController和LocalFocusManager的获取移至Dialog内部的Composable层级中
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:05:33