Jetpack Compose 焦点请求器无法使用 Dialog

alf*_*tap 13 android android-jetpack-compose

我正在使用下面的代码尝试将焦点请求到文本字段并显示键盘。目前,文本字段确实请求焦点,但键盘无法显示。相同的代码在我正在处理的另一个项目中工作,但这里的区别是此代码位于可组合对话框内,而其他代码不是,所以我不确定是否是对话框导致键盘无法显示?

val textField = remember { FocusRequester() }

 Dialog(onDismissRequest = {
    openDialog.value = false
    dialogInput.value = ""
}) {

    Column(
        modifier = Modifier
            .height(274.dp)
            .background(Color.Transparent)
            .clickable {
                openDialog.value = false
                dialogInput.value = ""
            }
    ) {

        OutlinedTextField(
            modifier = Modifier
                .height(64.dp)
                .background(Color.White)
                .focusRequester(textField),
            label = {
                Text(
                    text = label,
                    style = MaterialTheme.typography.body2.copy(color = Color.Black)
                )
            },
            value = dialogInput.value,
            onValueChange = {
                dialogInput.value = it
                events.filterPlayers(it)
            },
            textStyle = MaterialTheme.typography.body2.copy(color = Color.Black),
            colors = TextFieldDefaults.textFieldColors(
                backgroundColor = Color.White,
                unfocusedIndicatorColor = Color.White,
                focusedIndicatorColor = Color.White
            )
        )

        DisposableEffect(Unit) {
            textField.requestFocus()
            onDispose {}
        }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

val focusRequester = FocusRequester()
LocalView.current.viewTreeObserver.addOnWindowFocusChangeListener {
    if (it) focusRequester.requestFocus()
}
Run Code Online (Sandbox Code Playgroud)

这对我有用,在对话框窗口获得焦点后,文本字段的请求焦点将自动显示软键盘。

  • 感谢您的回答。使用“记住 { FocusRequester() }”更安全。另外,这里还有 Compose 问题跟踪器上此问题的 [链接](https://issuetracker.google.com/issues/204502668),您也可以将其添加到您的答案中。 (2认同)