根据片段和 activity 按下后退按钮时如何同步操作栏

How to sync action bar when back button pressed according fragment and activity

我正在研究菜单和 toolbar/actionbar。我正在尝试这种方式:一个 activity 容器和许多片段。我创建了一个工具栏并将其设置为 MainActivity (onCreate) 的操作栏:

val myToolbar = this.findViewById<Toolbar>(R.id.myToolbar)
setSupportActionBar(myToolbar)

然后,我用 onCreateOptionMenu 以正常方式添加 itens 并用 onOptionsItemSelected

处理点击

当调用 Fragment 1 时,我更改操作栏并像这样添加返回按钮 (onCreate):

val actBar = (activity as AppCompatActivity).supportActionBar
    actBar?.setDisplayHomeAsUpEnabled(true)
    actBar?.setDisplayShowHomeEnabled(true)
    actBar?.setDisplayUseLogoEnabled(false)
    actBar?.title = "Fragment 1 toolbar"
    actBar?.subtitle = ""
    setHasOptionsMenu(true)

然后从片段 1 调用片段 2,并以相同的方式设置:

要在片段中处理后退按钮点击,在 onOptionsItemSelected:

return if (item.itemId == android.R.id.home) {
     activity?.onBackPressed()
     true
   } else return when (item?.itemId){
     ...
     }
     else -> super.onOptionsItemSelected(item)
   }

并在 MainActivity 中覆盖 onBackPressed

override fun onBackPressed() {
        if(supportFragmentManager.backStackEntryCount > 0){
            supportFragmentManager.popBackStackImmediate()
        }else{
            super.onBackPressed()
        }
    }

问题是:如果我点击后退按钮,它会按预期返回,但会显示操作栏的最后一个对象。在 MainActivity 中,只有 action itens 按预期显示:

如何根据片段和 activity 同步栏?

注:

我找到了解决办法。我离开这里给任何感兴趣的人: 我应用了 OnBackStackChangedListener 来观察返回堆栈的变化。然后,您可以对 UI.

进行任何更改
    supportFragmentManager.addOnBackStackChangedListener {
         //UI changes
    }

在内部,我使用片段容器检查当前是否有片段:

supportFragmentManager.addOnBackStackChangedListener {

            val currentFragment = supportFragmentManager.findFragmentById(R.id.you_fragment_container)
            if (currentFragment == null){
                //rebuild action bar here or make any another changes
            }
}

在我的例子中,我比较 null 表示容器没有片段。因此,如果为 null,则根目录 activity 会出现在屏幕上。 这可用于对您想要的任何片段进行更改。 就是这样。