隐藏同一活动中特定片段上工具栏上的菜单

问题描述 投票:0回答:1

我有一个包含很少片段的活动。

一旦第一个片段到达活动,它就会在活动的 AppBar 布局上膨胀一些菜单(实际上只是一个操作按钮):

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)
    inflater.inflate(R.menu.menu_info, menu)
}

一旦用户导航到同一活动中的第二个片段,该操作按钮就应该隐藏。我无法实现这一点(请参阅下面的我的解决方案)。

所以,一般问题是:

如何仅对后台堆栈中的某些片段隐藏 Activity AppBarLayout 中的菜单?

注意:我不需要隐藏整个工具栏(标题仍然应该显示,我只想隐藏操作按钮!)

我尝试了不同的解决方案,不幸的是不起作用:

  1. 在第二个片段中调用 setHasOptionsMenu(false) (在 onCreate 和 onCreateView 中都尝试过)
  2. 在fragment的不同回调中调用activity.invalidateOptionsMenu(),然后尝试隐藏onCreateOptionsMenu中应在invalidate调用后再次调用的菜单元素。但我发现即使在无效调用之后它也没有被调用:
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    menu.forEach {
        it.isVisible = false
    }
}

还尝试结合所有这些解决方案,但它不起作用 - 按钮仍然显示在第二个片段上。

android android-fragments android-fragmentactivity
1个回答
0
投票

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.

         
           ...
     
    }
© www.soinside.com 2019 - 2024. All rights reserved.