提问人:Sheenergizer 提问时间:4/2/2023 最后编辑:Sheenergizer 更新时间:8/7/2023 访问量:157
如何修复在 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
问:
我目前正在使用 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
重新启动后有没有其他方法可以强制对焦?或者有办法避免应用程序崩溃?
答:
1赞
Aditya Arora
8/7/2023
#1
从共享的代码示例来看,似乎已将 添加到未标记为可聚焦节点的组件中。focusRequester
Box
- 如果您想获得焦点,请添加修饰符
Box
focusable()
- 如果这个盒子只是一个装饰,你希望它要求
聚焦并将其移动到其子组件之一,然后您可以
使用修饰符。
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()
}
}
评论