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

如何通过OutlinedTextField捕获回车键并调用KeyboardActions的onDone函数?

问题:OutlinedTextField的Done键盘动作未触发

使用自定义实现的OutlinedTextField(底层基于BasicTextField),已设置keyboardActions的onDone回调,但点击键盘的Done按钮时,回调未执行,键盘也不会自动收起。

原代码片段

上层OutlinedTextField实现:

OutlinedTextField(
    value = value,
    onValueChange = {
        value = it
    },
    keyboardActions = KeyboardActions(
        onDone = {
            onResult(value)
        }
    ),
    modifier = Modifier
        .fillMaxWidth()
        .height(26.dp)
        .focusRequester(focusRequester),
    singleLine = true,
    maxLines = 1
)

底层BasicTextField实现:

// If color is not provided via the text style, use content color as a default
val textColor = textStyle.color.takeOrElse {
    colors.textColor(enabled).value
}
val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))

BasicTextField(
    value = value,
    onValueChange = {
        if (it.text.length <= maxLength) {
            onValueChange(it.text)
        }
    },
    keyboardOptions = keyboardOptions,
    keyboardActions = keyboardActions,
)

解决方案

1. 必须指定keyboardOptions的imeAction为Done

默认情况下输入框的IME动作不是Done,导致键盘不会显示Done按钮,onDone回调自然无法触发,需在OutlinedTextField和底层BasicTextField中明确设置。

2. 在onDone回调中手动释放焦点收起键盘

Jetpack Compose不会自动在Done触发时收起键盘,需要调用焦点请求器的freeFocus()方法释放输入框焦点,触发键盘收起。

修改后的代码

上层OutlinedTextField:
OutlinedTextField(
    value = value,
    onValueChange = { value = it },
    // 新增:指定IME动作为Done
    keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
    keyboardActions = KeyboardActions(
        onDone = {
            onResult(value)
            // 释放焦点,收起键盘
            focusRequester.freeFocus()
        }
    ),
    modifier = Modifier
        .fillMaxWidth()
        .height(26.dp)
        .focusRequester(focusRequester),
    singleLine = true,
    maxLines = 1
)
底层BasicTextField:

确保keyboardOptions正确传递并保留Done动作(若自定义组件需要强制设置,可直接指定):

val textColor = textStyle.color.takeOrElse {
    colors.textColor(enabled).value
}
val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))

BasicTextField(
    value = value,
    onValueChange = {
        if (it.text.length <= maxLength) {
            onValueChange(it.text)
        }
    },
    // 确保IME动作为Done,若上层已传入则直接使用,否则强制设置
    keyboardOptions = keyboardOptions.copy(imeAction = ImeAction.Done),
    keyboardActions = keyboardActions,
)

关键说明

  • imeAction = ImeAction.Done是触发onDone回调的前提,只有键盘显示Done按钮,点击才会触发回调
  • 调用focusRequester.freeFocus()是收起键盘的核心操作,软键盘的显示状态与输入框的焦点绑定
  • 若自定义BasicTextField组件,需确保上层传入的keyboardOptions和keyboardActions参数被正确传递,不要覆盖必要配置

内容的提问来源于stack exchange,提问作者c-an

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:30:24