首页 > 解决方案 > 仅在某些片段中显示菜单操作 - NavigationComponents

问题描述

我有一个导航主机活动,它膨胀了 2 个片段,一个是主主机片段和事件片段,我需要在事件片段中显示一个菜单操作,但是这个菜单操作也显示在我不想显示的主片段中

如何仅在事件片段中显示此菜单?

主要活动

class MainActivity: AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            val navController = Navigation.findNavController(this, R.id.nav_host_fragment)
            setupActionBar(navController)
        }

        private fun setupActionBar(navController: NavController) {
            NavigationUI.setupActionBarWithNavController(this, navController)
        }

        override fun onSupportNavigateUp(): Boolean {
            return Navigation.findNavController(this, R.id.nav_host_fragment).navigateUp()
                    || super.onSupportNavigateUp()
        }

        override fun onCreateOptionsMenu(menu: Menu?): Boolean {
            MenuInflater(this).inflate(R.menu.menu, menu)
            return super.onCreateOptionsMenu(menu)
        }

        override fun onOptionsItemSelected(item: MenuItem?): Boolean {
            NavigationUI.onNavDestinationSelected(item!!, Navigation.findNavController(this, R.id.nav_host_fragment))
            return super.onOptionsItemSelected(item)
        }

菜单

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/eventsFragment"
        app:showAsAction="ifRoom|always"
        android:title="¿ Where to buy ?" />

</menu>

我只需要在 eventsFragment 中显示此菜单

事件片段

class EventsFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_event, container, false)
    }

但是不仅在 EventFragment 中显示它,它还在 MainActivity 作为主机膨胀的第一个片段中显示它

我怎样才能在我的 EventsFragment 中有这个菜单?

标签: androidandroid-fragmentskotlinnavigationandroid-architecture-navigation

解决方案


在 MainActivity menuItem setVisible(false) 中:

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
  MenuInflater(this).inflate(R.menu.menu, menu)
  val menuItem : MenuItem = menu.findItem(R.id.eventsFragment);
   if (menuItem!= null)
       menuItem.setVisible(false);
   return super.onCreateOptionsMenu(menu)
 }

在 EventsFragment 中将 menuitem 的可见性设置为 true 如下所示:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setHasOptionsMenu(true)

}

override fun onPrepareOptionsMenu(menu: Menu) {
    val menuItem = menu.findItem(R.id.eventsFragment)
    if (menuItem != null)
        menuItem.isVisible = true
}

推荐阅读