Mie*_*źma 9 java android android-fragments kotlin onbackpressed
我想在活动的(Java)片段(Kotlin)之一中处理用户的后按操作。
在活动的 onCreate 方法中我调用
OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(true) {
(...) handling back press when there's other BackPressedDispatcherCallbacks registered (...)
}
getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
Run Code Online (Sandbox Code Playgroud)
然后在我想要处理后按的片段的 onCreateView() 中,我调用
activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
(...) handling back press here, not in activity (...)
}})
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作,直到我将应用程序置于后台然后返回前台,导致 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 的回调成为最后一个活动回调并接收返回事件而不是片段。
我正在寻找解决方案。我真的很感激任何关于如何推动它前进的建议。
附言。调用最后一个片段方法(活动fragmentManager堆栈上的最后一个)的方法是行不通的,因为目前,对于应用程序来说,这些片段不添加到后台堆栈至关重要。
小智 4
您只需在活动中使用即可
getOnBackPressedDispatcher().addCallback(onBackPressedCallback);
Run Code Online (Sandbox Code Playgroud)
代替
getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
Run Code Online (Sandbox Code Playgroud)
如果回调中不传递lyfecycleOwneraddCallback
会立即添加到责任链中,所以不必等待activity状态为STARTED
归档时间: |
|
查看次数: |
698 次 |
最近记录: |