Android Fragments 在同一Activity中的特定片段上隐藏工具栏中的菜单

x3naxklr  于 12个月前  发布在  Android
关注(0)|答案(1)|浏览(140)

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

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

字符串
一旦用户被导航到同一个Activity中的第二个片段,这个动作按钮应该被隐藏。我不能做到这一点(见下面我的解决方案)。
所以,一般来说,问题是:

如何仅对回栈中的部分片段在Activity AppBarLayout中隐藏菜单?
注意:我不需要隐藏整个图标(标题仍然应该显示,我只想隐藏操作按钮!)

我尝试了不同的解决方案,不幸的是不工作:
1.在第二个片段中调用setHasOptionsMenu(false)(在onCreate和onViewView中都尝试过)
1.在片段的不同回调中调用activity.invalidateOptionsMenu(),然后尝试隐藏onvalidateOptionsMenu中的menu元素,该元素在invalidate调用后应该再次调用。但我看到它甚至在invalidate调用后也没有被调用:

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    menu.forEach {
        it.isVisible = false
    }
}


也试图将所有这些解决方案合并,但它不起作用-按钮仍然显示在第二个片段。

ukqbszuj

ukqbszuj1#

oncodeOptionsMenu已被弃用。您应该改用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.

         
           ...
     
    }

字符串

相关问题