Android Fragments 在应用程序从后台返回后,处理来自片段的回压

cpjpxq1n  于 12个月前  发布在  Android
关注(0)|答案(2)|浏览(149)

我想在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的回调。
我发现

  1. 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)的方法不起作用,因为目前,这些片段不添加到回栈对应用程序至关重要。
2wnc66cl

2wnc66cl1#

你可以在活动中使用

getOnBackPressedDispatcher().addCallback(onBackPressedCallback);

字符串
而不是

getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);


如果您没有在addCallback中传递lyfecycleOwner,则回调将立即添加到责任链中,因此您不必等待Activity状态为STARTED

j7dteeu8

j7dteeu82#

公认的解决方案对我不起作用,所以我做了

requireActivity().onBackPressedDispatcher.addCallback(
    requireActivity(),
    backPressedCallback
)

字符串
在我的片段的onCreate()中,它对我有效

相关问题