android-fragments 父片段和子片段之间的生命周期

wbgh16ku  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(172)

所有的Fragment都继承自BaseFragment。
我想给每个片段分别给予按下事件,但是BaseFragment有这样的默认返回按下事件。

override fun onResume() {
        super.onResume()
        logd("onResume() BaseFragment")
        requireActivity().onBackPressedDispatcher.addCallback(this, backPressCallback)
    }

而且这些子片段

override fun onResume() {
        super.onResume()
        logd("onResume() ChildFragment")
        requireActivity().onBackPressedDispatcher.addCallback(this, backPressCallback)
    }

它将打印、

onResume() BaseFragment
onResume() ChildFragment

因此,ChildFragment重写,当我按下返回按钮时,ChildFragment的backPressCallback被调用。
但是,当我出去和回来的时候,顺序是不同的。

onResume() ChildFragment
onResume() BaseFragment

因此,用户看到了ChildFragment,但调用了BaseFragment的backPressCallback。它的行为与我预期的不同。(例如,我想要popBackStack,但关闭了应用程序)
我该如何解决这个问题呢?或者在调用父片段之后是否有调用的方法?
根据this article,BaseFragment必须在ChildFragment之前被调用。但看起来并非如此。

66bbxpm5

66bbxpm51#

activity?.onBackPressedDispatcher?.addCallback(
                    viewLifecycleOwner,
                    object : OnBackPressedCallback(true) {
                        override fun handleOnBackPressed() {
                            try {
                                if (!isChildFragmentOpen)
                                {
                                    val trans: FragmentTransaction =
                                        parentFragmentManager.beginTransaction()
                                    trans.remove(Fragment())
                                    trans.commit()
                                }else{
                                    parentFragmentManager.popBackStack()
                                } 
                            } catch (e: Exception) {
                                e.message
                            }
                        }
                    })

将此添加到您片段中。

相关问题