必须手动清除每个片段上的选项菜单

Have to manually clear options menu on every fragment

我在某些片段上有选项菜单,但这里的情况是最后打开的选项菜单一直出现在没有任何选项菜单的片段中,如果下一个片段中有选项菜单,则两个最后打开的选项菜单项并且当前片段选项菜单项出现在当前片段中。

我目前的解决方案是

// in fragments that have options menu
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        menu.clear()
        inflater.inflate(R.menu.menu_options, menu)
}

// in fragment where there is no options menu
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
}

override fun onPrepareOptionsMenu(menu: Menu) {
        menu.clear()
}

我什至尝试在有选项菜单的片段中关注,但没有用

 override fun onOptionsMenuClosed(menu: Menu) {
        menu.clear()
 }

必须在每个没有选项菜单的片段上覆盖 onCreateonPrepareOptionsMenu 并不是一个好的解决方案。我有很多片段(我正在使用带有导航架构组件的单个 activity 模式)。 我怎样才能更好地解决这个问题?

您可以创建一个 BaseFragment class 并在其中覆盖您的 onCreate()。 因此,您将能够使用 BaseFragment

扩展每个 YourFragment

您还需要在 onCreate()

中调用 invalidateOptionsMenu()

这里是link文档

尽管我按照 Anton 的建议进行了操作,但即使该选项菜单开始出现并且菜单项开始复制。所以在 issuetracker 中提交了 issue。他们帮助我解决了问题。

原因是我使用的是 ViewPager2,我将错误的 FragmentManager 传递给了 PagerAdapter 的构造函数

// instead of
pager.adapter = PagerAdapter(activity!!)
class PagerAdapter(fa:FragmentActivity): FragmentStateAdapter(fa) {

// pass container of the ViewPager2 to the PagerAdapter's constructor
// use Fragment as the FragmentManager since ViewPager2 is inside a Fragment
pager.adapter = PagerAdapter(this)
class PagerAdapter(f:Fragment): FragmentStateAdapter(f) {