android 导航 popBackStack 行为

android navigation popBackStack behaviour

我在下面添加了随机片段(First、SecondFragment 或 ThirdFragment)的代码

private fun addFragment() {
        activeFragment = if (activeFragment is FirstFragment) {
            SecondFragment()
        } else if (activeFragment is SecondFragment) {
            ThirdFragment()
        } else {
            FirstFragment()
        }
        fragmentTransaction = fragmentManager!!.beginTransaction()
        fragmentTransaction?.add(R.id.fragment_container, activeFragment!!)
            ?.addToBackStack(null)
            ?.commit()

    }

    override fun onBackPressed() {
        val fragment = fragmentManager?.findFragmentById(R.id.fragment_container)
        if (fragment != null) {
            Log.d("mytag", "onBackPressed: $fragment")
            fragmentManager?.popBackStack()
            return
        }
        super.onBackPressed()
    }

在上面的代码中一切正常。我的意思是,当我按下后退按钮时,它会弹出最后一个片段并显示上一个片段(如果有的话)。

但是如果我在 if check 中删除 return statement(在 onBackPressed function 中),那么它会立即从返回堆栈中弹出 2 个片段。(我添加了 onBackStackChangedListener,我可以看到如何当我弹出时留下了很多项目,所以如果有 3 个片段我在弹出时返回堆栈它会删除 2 个片段并且只剩下 1 个,然后如果我再次单击返回,它会删除最后一个片段并破坏应用程序)

您看到此行为的原因是当您使用 addToBackStack() 作为 super.onBackPressed() 调用的一部分时,片段 已经 处理系统后退按钮.

这意味着您在使用片段时根本不需要覆盖 onBackPressed()