【问题标题】:How to sync action bar when back button pressed according fragment and activity根据片段和活动按下后退按钮时如何同步操作栏
【发布时间】:2023-03-14 01:23:01
【问题描述】:

我正在研究菜单和工具栏/操作栏。我正在尝试这种方式:一个活动容器和许多片段。我创建并设置了一个工具栏作为 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)

然后从 Fragment 1 调用 Fragment 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 中,仅按预期显示操作项:

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

注意:

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

  • 片段被添加到后台堆栈

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多