我想在Activity的一个(Java)片段(Kotlin)中处理用户的后按。
在活动的onCreate方法中,我调用
OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(true) {
(...) handling back press when there's other BackPressedDispatcherCallbacks registered (...)
}
getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
字符串
然后在我想处理backpress的片段的onView()中调用
activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
(...) handling back press here, not in activity (...)
}})
型
一切都按预期工作,直到我在后台获取应用程序,然后返回前台,导致Activity和Fragment的OnStop -> OnStart被调用。
在这种情况下,应用程序会忽略Fragment回调,并调用Activity的回调。
我发现
- onBackPressedDispatcher以添加回调的相反顺序调用回调。只有当最近添加的回调未启用时,才会调用任何先前添加的回调(仅调用最后启用的回调)
1.向Activity和Fragment生命周期添加观察者并记录结果打印:
FRAG:ON_START ACT:ON_START FRAG:ON_RESUME ACT:ON_RESUME
OnStart和OnResume上的Activity在Fragments等价物之后被调用,这有效地使Activity的回调成为最后一个活动回调,并接收回事件而不是片段。
我正在寻找解决办法。如果您能给我一些建议,我将不胜感激。
PS.调用last fragments方法(activity fragmentManager堆栈上的last)的方法不起作用,因为目前,这些片段不添加到回栈对应用程序至关重要。
2条答案
按热度按时间2wnc66cl1#
你可以在活动中使用
字符串
而不是
型
如果您没有在
addCallback
中传递lyfecycleOwner,则回调将立即添加到责任链中,因此您不必等待Activity状态为STARTEDj7dteeu82#
公认的解决方案对我不起作用,所以我做了
字符串
在我的片段的
onCreate()
中,它对我有效