如何通过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
相关产品推荐
相关产品推荐

