根据片段和 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 同步栏?
注:
我正在使用 Kotlin,但欢迎 Java 解决方案(转换为 kotlin
稍后)
片段被添加到后台堆栈
我找到了解决办法。我离开这里给任何感兴趣的人:
我应用了 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 会出现在屏幕上。
这可用于对您想要的任何片段进行更改。
就是这样。
我正在研究菜单和 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 同步栏?
注:
我正在使用 Kotlin,但欢迎 Java 解决方案(转换为 kotlin 稍后)
片段被添加到后台堆栈
我找到了解决办法。我离开这里给任何感兴趣的人:
我应用了 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 会出现在屏幕上。 这可用于对您想要的任何片段进行更改。 就是这样。