我有一个包含很少片段的活动。
一旦第一个片段到达活动,它就会在活动的 AppBar 布局上膨胀一些菜单(实际上只是一个操作按钮):
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.menu_info, menu)
}
一旦用户导航到同一活动中的第二个片段,该操作按钮就应该隐藏。我无法实现这一点(请参阅下面的我的解决方案)。
所以,一般问题是:
如何仅对后台堆栈中的某些片段隐藏 Activity AppBarLayout 中的菜单?
注意:我不需要隐藏整个工具栏(标题仍然应该显示,我只想隐藏操作按钮!)
我尝试了不同的解决方案,不幸的是不起作用:
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
menu.forEach {
it.isVisible = false
}
}
还尝试结合所有这些解决方案,但它不起作用 - 按钮仍然显示在第二个片段上。
onCreateOptionsMenu 已被弃用。您应该使用 MenuProvider api 来代替。
在您的第一个片段或要显示特定菜单的片段上:
private val menuProvider = object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_info, menu)
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
return when (menuItem.itemId) {
R.id.menu_info_menu1 -> {
//Do something
return true
}
R.id.menu_info_menu2 -> {
//Do something
return true
}
else -> false
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//show the menu
requireActivity().addMenuProvider(menuProvider, this)
//alternatively, you can also specify the specific lifecycle state
//when the the menu should show and hide like the following.
requireActivity().addMenuProvider(menuProvider, this, Lifecycle.State.RESUMED)
//This will hide the menu when the fragment lifecycle state is below RESUMED.
//If not specified, it will be hidden when fragment is destroyed.
...
}