在不弹出键盘的情况下,请求将焦点放在文本输入框上

移动开发 2026-07-10

我希望在用户打开屏幕时,聊天界面的文本输入框默认获得焦点(光标应可见)。但我不想让键盘自动弹出。键盘应仅在用户明确点击文本输入框时才出现。

我想实现类似WhatsApp的行为。

我在网上搜索并浏览了文档,但没有找到有用的解决方案。

val msg = remember { mutableStateOf(TextFieldValue()) }
TextField(
    modifier = Modifier.fillMaxWidth(),
    value = msg .value,
    onValueChange = { value : TextFieldValue ->
        msg .value = value
    }
)

解决方案

你不能很容易地在默认情况下同时保持焦点而不弹出键盘,因为这是一个内置功能,获得焦点通常会打开键盘。

解释:

在Jetpack Compose中,当TextField获得焦点时,键盘会自动弹出。在这段代码里,我通过将LocalTextInputService设置为null,初次让键盘不弹出。于是字段获得焦点,但不会弹出键盘。

当用户点击该字段时,键盘会再次启用并请求焦点,因此此时键盘会打开。

为什么需要:

在Compose中没有直接的方法在不打开键盘的情况下保持焦点。这种做法有助于避免自动弹出键盘,从而提供更顺畅的用户体验。

但你可以使用以下代码来实现:

@Composable
fun ChatScreen() {

    var fieldValue by remember { mutableStateOf("") }
    val focusRequester = remember { FocusRequester() }
    var enableKeyboard by remember { mutableStateOf(false) }

    LaunchedEffect(Unit) {
        focusRequester.requestFocus()
    }

    CompositionLocalProvider(
        LocalTextInputService provides if (enableKeyboard) LocalTextInputService.current else null
    ) {
        OutlinedTextField(
            value = fieldValue,
            onValueChange = { fieldValue = it },
            modifier = Modifier
                .fillMaxWidth()
                .padding(top = 16.dp)
                .focusRequester(focusRequester)
                .pointerInput(Unit) {
                    awaitPointerEventScope {
                        while (true) {
                            awaitPointerEvent()
                            enableKeyboard = true
                            focusRequester.requestFocus()
                        }
                    }
                }
        )
    }
}

希望这些建议对你有帮助!

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章