【问题标题】:How to hide menu item from fragment?如何从片段中隐藏菜单项?
【发布时间】:2020-03-09 19:18:28
【问题描述】:

我想在导航抽屉的菜单中隐藏一个菜单项。 我尝试使用 setHasOptionsMenu(true) 然后添加方法

public boolean onPrepareOptionsMenu(Menu menu){
    //this is where i tried to hide the item
    menu.findItem(R.id.item).setVisible(false);
}

但它说那是空的。

有什么建议吗?

【问题讨论】:

  • 感谢您的所有建议,不幸的是它没有奏效。显然从片段中菜单是不可见的,即使我可以看到它。我所做的是将活动中的菜单项设为静态,这样我就可以从片段中访问它们

标签: android fragment menuitem


【解决方案1】:

您应该在片段的 onCreate() 方法中调用 setHasOptionsMenu(true) 以允许片段处理菜单项。所以你可以在你的片段中做这样的事情:

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
 }

然后,您可以在片段中覆盖 onPrepareOptionsMenu 方法:

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
// You can hide the state of the menu item here if you call getActivity().supportInvalidateOptionsMenu(); somewhere in your code
    MenuItem menuItem = menu.findItem(R.id.item); 
    menuItem.setVisible(false);
    }

【讨论】:

    【解决方案2】:

    getActivity().invalidateOptionsMenu();将调用 onPrepareOptionsMenu 并更新您的菜单。

    【讨论】:

      【解决方案3】:

      我也遇到了同样的问题,如果您正在使用 Navigation Drawer 并想使用菜单,那么您必须检查片段可见性: 请按照您的片段中的步骤操作,它对我有用:

      1)检查片段可见性

      boolean isMenuVisible  = false;
      @Override
      public void setMenuVisibility(boolean menuVisible) {
          try {
              super.setMenuVisibility(menuVisible);
              if (menuVisible && searchView != null) {
                  isMenuVisible  = menuVisible;
              }
          } catch (Exception e) {
              CommonUtils.firebaseCrashReport(e);
          }
      }
      

      2) 输入此代码

      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setHasOptionsMenu(true);
      }
      

      2 然后只需检查 isMenuVisible 的真值并使用菜单播放

      @Override public void onPrepareOptionsMenu(Menu menu) {
      super.onPrepareOptionsMenu(menu);
      if(isMenuVisible){
          MenuItem menuItem = menu.findItem(R.id.item);
          menuItem.setVisible(false);
      }
      

      }

      【讨论】:

        【解决方案4】:

        这可以通过隐藏菜单项来完成

        活动中:
        navigationView = (NavigationView) findViewById(R.id.nav_view);`
        

        在片段中:

        Menu nav_Menu = context.navigationView.getMenu();<br/>
        nav_Menu.findItem(R.id.item_id).setVisible(false);<br>
        

        您可以将活动上下文传递给片段

        【讨论】:

          【解决方案5】:

          当您使用导航抽屉时,您必须从中获取MenuItem

          NavigationView 引用存储在onCreate 中:

          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(layoutId);
          
              ...
          
              nvDrawer = (NavigationView) findViewById(R.id.nvView);
          }
          

          隐藏onPrepareOptionsMenu中的MenuItem:

          @Override
          public boolean onPrepareOptionsMenu(Menu menu) {
              boolean ret = super.onPrepareOptionsMenu(menu);
          
              MenuItem stateBtn = nvDrawer.getMenu().findItem(R.id.item);
              stateBtn.setVisible(true);
          
              return ret;
          }
          

          【讨论】:

            【解决方案6】:

            在 onCreate() 调用中

            setHasOptionMenu(true)
            

            并像这样检查 onPrepareOptionsMenu() 中的空项..

            @Override
            public void onPrepareOptionsMenu(Menu menu) {
                MenuItem item=menu.findItem(R.id.menu_id);
                if(item!=null)
                   item.setVisible(false);
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-05-02
              • 1970-01-01
              • 2015-11-17
              • 2013-04-23
              • 1970-01-01
              • 2020-04-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多