使用Jetpack Compose编程性地单击文本字段

4
有没有一种方法可以以编程方式单击文本字段,以便在我的搜索屏幕弹出时,它自动单击文本字段并弹出键盘。或者,有没有一种方法可以知道文本字段的触摸事件?
1个回答

1

使用1.0.x,您可以将焦点放在组件上。
类似于:

var text by remember { mutableStateOf(TextFieldValue("text")) }
val focusRequester = FocusRequester()
val keyboardController = LocalSoftwareKeyboardController.current

val interactionSource = remember { MutableInteractionSource() }
val isFocused by interactionSource.collectIsFocusedAsState()

Column {
    TextField(
        value = text,
        onValueChange = {
            text = it
        },
        interactionSource = interactionSource,
        label = { Text("label") },
        modifier = Modifier
            // add focusRequester modifier
            .focusRequester(focusRequester)
            .onFocusChanged {
                if (isFocused) {
                    keyboardController?.show()
                }
            }
    )
}

然后:


DisposableEffect(Unit) {
    focusRequester.requestFocus()
    onDispose { }
}

它有效了!谢谢,但我有一个问题,这种情况下interactionsource是什么作用? - Chun2Maru
@Chun2Maru 请同时查看 https://developer.android.com/reference/kotlin/androidx/compose/foundation/interaction/InteractionSource。在这种情况下,它用于获取有关焦点状态的信息。 - Gabriele Mariotti
@GabrieleMariotti 我正在尝试这种方法,但是遇到了很多问题 - 例如,如果组件已经请求了焦点,那么它会无限期地保持这个焦点。例如,当用户在组件(TextField)外单击时,组件仍然保持焦点并保持IME打开状态,这真的是一种非常烦人的行为,需要特别处理。也许通过释放focusRequester来解决。我认为最好的方法是将光标放在TextField内(或“以编程方式单击TextField内部”),让Android自己处理焦点流,而不是干涉焦点。 - TomR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接