在不弹出键盘的情况下,请求将焦点放在文本输入框上
我希望在用户打开屏幕时,聊天界面的文本输入框默认获得焦点(光标应可见)。但我不想让键盘自动弹出。键盘应仅在用户明确点击文本输入框时才出现。
我想实现类似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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。