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

时间:2018-07-29 21:56:32

标签: android android-actionbar fragment toolbar back-button

我正在研究菜单和工具栏/操作栏。我正在尝试:一个活动容器和许多片段。我创建并设置了一个工具栏作为MainActivity(onCreate)的操作栏:

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

然后,我以常规方式使用onCreateOptionMenu添加itens,并使用onOptionsItemSelected处理点击。

enter image description here

在调用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)

enter image description here

然后从片段1中调用片段2并以相同的方式进行设置: enter image description here

要处理后退按钮,请在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中,仅按预期显示动作iten: enter image description here

如何根据片段和活动来同步栏?

注意:

  • 我正在使用Kotlin,但是欢迎使用Java解决方案(将其转换为kotlin 稍后)

  • 将片段添加到堆栈中

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我为任何感兴趣的人离开这里: 我应用了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,则在屏幕上显示根活动。 这可用于更改您想要的任何片段。 就是这样。