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

Android 根据片段和活动按下后退按钮时如何同步动作栏,android,android-actionbar,fragment,toolbar,back-button,Android,Android Actionbar,Fragment,Toolbar,Back Button,我正在研究菜单和工具栏/操作栏。我试着这样做:一个活动容器和许多片段。我为MainActivity(onCreate)创建并设置了一个工具栏作为actionbar: 然后从片段1调用片段2,并按照相同的方式进行设置: 要处理后退按钮,请在onOptionsItemSelected中的片段中单击: return if (item.itemId == android.R.id.home) { activity?.onBackPressed() true } else r

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

然后从片段1调用片段2,并按照相同的方式进行设置:

要处理后退按钮,请在
onOptionsItemSelected
中的片段中单击:

return if (item.itemId == android.R.id.home) {
     activity?.onBackPressed()
     true
   } else return when (item?.itemId){
     ...
     }
     else -> super.onOptionsItemSelected(item)
   }
并在Main活动中覆盖反压的
on

override fun onBackPressed() {
        if(supportFragmentManager.backStackEntryCount > 0){
            supportFragmentManager.popBackStackImmediate()
        }else{
            super.onBackPressed()
        }
    }
问题是:如果我点击后退按钮,它会按预期后退,但会显示动作栏的最后一个对象。在MainActivity中,仅按预期显示动作ITEN:

如何根据片段和活动同步酒吧

注:

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

  • 片段被添加到后堆栈中


    • 我找到了解决办法。我离开这里是为了任何感兴趣的人: 我在backbackbackchangedListener上应用了
      来监视后堆栈上的更改。然后,您可以在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,则根活动显示在屏幕上。 这可以用于对您想要更改的任何片段进行更改。 就这样

          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
                  }
      }