java - 应用程序从后台返回后处理片段的后按
问题描述
我想在活动的(Java)片段(Kotlin)之一中处理用户后推。
在我调用的活动的 onCreate 方法中
OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(true) {
(...) handling back press when there's other BackPressedDispatcherCallbacks registered (...)
}
getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
然后在我想处理后按的片段的 onCreateView() 中,我调用
activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
(...) handling back press here, not in activity (...)
}})
一切都按预期工作,直到我将应用程序置于后台,然后返回前台,导致调用 Activity 和 Fragment 的 OnStop -> OnStart。
在这种情况下,应用程序会忽略 Fragment 回调并且正在调用 Activity 的回调。
我发现的是
onBackPressedDispatcher 以与添加它们的相反顺序调用回调。仅当最近添加的回调未启用时,才会调用任何先前添加的回调(仅调用最后启用的回调)
将观察者添加到 Activity 和 Fragment 生命周期并记录结果打印:
FRAG:ON_START ACT:ON_START FRAG:ON_RESUME ACT:ON_RESUME
OnStart 和 OnResume 上的 Activity 在 Fragments 等效项之后被调用,这有效地使 Activity 的回调成为最后一个活动的回调并接收返回事件而不是 Fragment。
我正在寻找解决方案。我真的很感激任何关于如何推动它的建议。
PS。调用最后一个片段方法(在活动 FragmentManager 的堆栈上的最后一个)的方法不起作用,因为目前,这些片段不添加到后堆栈对应用程序至关重要。
解决方案
您可以在活动中使用
getOnBackPressedDispatcher().addCallback(onBackPressedCallback);
代替
getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
如果不通过addCallback
回调中的 lyfecycleOwner 会立即加入责任链,这样就不用等待activity状态被STARTED了
推荐阅读
- python - 如何实现模块委托器?
- r - 如何克服 R 中的大整数限制?
- c# - 哪个快捷方式用`;`完成当前行然后开始新行?
- node.js - Mongoose 从 csv 导入数据仅插入部分数据
- angular - 如何在 ngx-editor 中禁用图像粘贴?
- javascript - GraphQL:错误:为构建模式提供的类型之一缺少名称
- tensorflow - AttributeError:模块“tensorflow_privacy”没有属性“DPQuery”
- amazon-web-services - AWS Dynamodb ..NET Core LoadAsync 不使用辅助键作为搜索键
- python - Python 通过在终端中调用名称来运行包
- powershell - 如何使用 Set-PSReadLineOption 在 PowerShell 中更改文本和背景的颜色