如何修复在 Kotlin Jetpack Compose 中重新启动活动时 D/Compose Focus: Owner FocusChanged(false) 的每应用语言崩溃问题

How to fix crashes on Per App Language where D/Compose Focus: Owner FocusChanged(false) when relaunching activity in Kotlin Jetpack Compose

提问人:Sheenergizer 提问时间:4/2/2023 最后编辑:Sheenergizer 更新时间:8/7/2023 访问量:157

问:

我目前正在使用 Jetpack compose 在 Android (Kotlin) 上试验每应用语言。我有一个抽屉,可以在其中调用更改语言的选择(https://github.com/android/user-interface-samples/blob/main/PerAppLanguages/compose_app/app/src/main/java/com/example/perapplanguages/MainActivity.kt 中的LocaleDropDownMenu)。我遵循了所有需要的内容并且它起作用了,屏幕(活动)将重新启动,文本将更改。但是,我注意到一个错误,即每当更改语言时,我都会看到日志消息“D/Compose Focus: Owner FocusChanged(false)”。如果之后,我尝试按“返回”按钮退出应用程序,我将收到“无响应”消息。我可以选择等待,然后如果我尝试按后退,它会响应并关闭。如果我在更改语言后执行其他操作,例如查看/滚动/单击主屏幕一段时间,然后单击“返回”按钮退出,它将毫无问题地关闭

我试图使用 FocusRequester,但我认为我用错了。我应该使用副作用吗?

主屏幕

@Composable
fun HomeScreen(modifier: Modifier = Modifier, viewModel: MainViewModel) {

    val focusRequester = remember { FocusRequester() }

    Box(
        modifier = Modifier
            .focusRequester(focusRequester)
            .fillMaxSize(),

        contentAlignment = Alignment.Center) {
        Column {
         ....
        }

    }


}

Logcat 结果:

ActivityManager   system_server     ANR in ...
                       Reason: Input dispatching timed out (Application does not have a focused window) ...
Frozen: false

重新启动后有没有其他方法可以强制对焦?或者有办法避免应用程序崩溃?

Kotlin Android-Activity Android-Jetpack 失去焦点

评论


答:

1赞 Aditya Arora 8/7/2023 #1

从共享的代码示例来看,似乎已将 添加到未标记为可聚焦节点的组件中。focusRequesterBox

  • 如果您想获得焦点,请添加修饰符Boxfocusable()
  • 如果这个盒子只是一个装饰,你希望它要求 聚焦并将其移动到其子组件之一,然后您可以 使用修饰符。focusGroup()

下面是更新后的示例代码:

@Composable
fun HomeScreen(modifier: Modifier = Modifier, viewModel: MainViewModel) {

    val focusRequester = remember { FocusRequester() }

    Box(
        modifier = Modifier
            .focusRequester(focusRequester)
            .fillMaxSize()
            .focusGroup() // Replace with focusable() if you want the box to gain focus
    ) {
        ...
    }

    LaunchedEffect(Unit) {
        focusRequester.requestFocus()
    }
}