【问题标题】:Hide MenuItem in some Fragments在某些片段中隐藏 MenuItem
【发布时间】:2014-02-01 13:16:49
【问题描述】:

我使用的菜单抽屉有更多 Fragments。在某些Fragments 中,我有菜单项REFRESH,但在某些片段中,我想隐藏此菜单项(我不想显示菜单,但我不想隐藏ActionBar)。

我尝试将覆盖 onCreateOptionsMenu() 添加到 Fragment 我不想显示此菜单项但我无法让它工作。我尝试了很多方法来查看代码中的注释行。知道问题出在哪里吗?最后,当我在 MainActivity 中调用 onPrepareOptionsMenu() 时激活菜单抽屉时,这个菜单项会隐藏,但是当我在 Fragment 时我需要这样做。

Fragment 我想隐藏菜单项刷新:

 public class FindPeopleFragment extends Fragment {
    public FindPeopleFragment(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_find_people, container, false);
        //setHasOptionsMenu(false);
        return rootView;
    }

    private Menu menu=null;
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
    {
        inflater.inflate(R.menu.main, menu);
        this.menu=menu;
        menu.findItem(R.id.refresh).setVisible(false);
        getActivity().invalidateOptionsMenu();
        //setHasOptionsMenu(false);
        super.onCreateOptionsMenu(menu,inflater);
    }
}

MainActivity在哪里定义了MENU DRAWER:

 //Slide menu item click listener
private class SlideMenuClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
        // display view for selected nav drawer item
        displayView(position);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // toggle nav drawer on selecting action bar app icon/title
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    switch (item.getItemId()) {
        case R.id.refresh:
            Toast.makeText(this, "Refreshing data...", Toast.LENGTH_SHORT).show();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

 // Called when invalidateOptionsMenu() is triggered
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    // if nav drawer is opened, hide the action items
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
    menu.findItem(R.id.refresh).setVisible(!drawerOpen);
    return super.onPrepareOptionsMenu(menu);
}

【问题讨论】:

    标签: android android-fragments android-optionsmenu


    【解决方案1】:

    在要隐藏Item的片段中

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

    在你的片段的 onCreate() 中

     setHasOptionsMenu(true);
    

    【讨论】:

    • 这比公认的答案要好。
    【解决方案2】:

    在你不想显示任何菜单选项的Fragment 中,你需要在onCreate() 中的setHasOptionsMenu(false);,像这样:

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

    但是,您想要隐藏 (REFRESH) 的正在显示的菜单属于 MainActivity。这就是为什么它总是显示出来。由于您想在Fragment 级别控制菜单(而不显示Activity 选项菜单),我的建议是从Activity 中删除菜单代码并在您的Fragment 中实现它。

    Activitys 和Fragments 都可以有自己独立的菜单。看到这个link

    【讨论】:

    • 不走运,我试了一下,但菜单项仍然存在。(问题会在其他地方。
    • 您必须在 onCreate() 中设置,而不是在 onCreateView() 中。
    • 是的,我复制粘贴您的代码,正如我所说,它不起作用,菜单项仍然可见。
    • 好的。我知道问题是什么。我会尽快更新我的回复。
    • @PavolFranek 你做了什么改变来让它工作?我有同样的问题。我从 FragmentActivity 中删除了选项菜单,只将它放在一个 Fragment 中,但它仍然显示在所有 Fragment 中。
    【解决方案3】:

    请试试这个

    @Override 
    public void onPrepareOptionsMenu(Menu menu) {
        menu.clear();
    }
    

    并将它放在你的碎片的 onCreate() 上

    setHasOptionsMenu(true);
    

    【讨论】:

      【解决方案4】:

      在片段类中

       @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setHasOptionsMenu(true);
          }
      
          @Override
          public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
              super.onCreateOptionsMenu(menu, inflater);
              menu.clear();
          }
      

      【讨论】:

        【解决方案5】:

        在 Kotlin 中为需要它的人提供

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setHasOptionsMenu(true)
        }
        
        override fun onPrepareOptionsMenu(menu: Menu) {
            super.onPrepareOptionsMenu(menu)
            menu.clear()
        }
        

        【讨论】:

          【解决方案6】:

          我使用下面的代码将菜单项隐藏在我不想使用的片段中。 注意:请阅读评论

          @Override
          public boolean onCreateOptionsMenu(Menu menu) {
          
              MenuInflater inflater = getMenuInflater();
              inflater.inflate(R.menu.main, menu);
              Fragment whichFragment=getVisibleFragment();//getVisible method return current visible fragment
              String shareVisible=whichFragment.getClass().toString();
              if(shareVisible.equals(AccFragment.class.toString())
                      ||shareVisible.equals(SocFragment.class.toString())
                      ||shareVisible.equals(DevFragment.class.toString())
                      ){
                  MenuItem item=menu.findItem(R.id.action_share);
                  item.setVisible(false);
              }
              return super.onCreateOptionsMenu(menu);
          }
          

          【讨论】:

          • 为什么不直接使用if (whichFragment instanceof AccFragment || whichFragment instanceof SocFragment || whichFragment instanceof DevFragment) { //your code }
          【解决方案7】:

          在 Kotlin 中

          override fun onPrepareOptionsMenu(menu: Menu) {
              val item: MenuItem = menu.findItem(R.id.action_search)
              item.isVisible = false
          }
          

          在片段的 onCreate() 中 setHasOptionsMenu(true)

          【讨论】:

          • 完美!如果你想隐藏一个特定的菜单项,这个肯定会起作用。
          【解决方案8】:

          有许多不同版本的类似解决方案,但不幸的是,它们都不适合我。我正在分享最终对我有用的内容,以隐藏带有多个菜单项的整个溢出菜单。想也许它对任何人都有用。

          我用id 将我的菜单分组,然后引用id

          @Override
          public void onPrepareOptionsMenu(Menu menu) {
              menu.setGroupVisible(R.id.menu_overflow, false);
              super.onPrepareOptionsMenu(menu);
          }
          

          如果你想隐藏任何单独的菜单项,那么你可以使用

          menu.getItem(R.id.action_licenses).setVisible(false);
          

          重要的是你应该在onViewCreated() 中有setOptionsMenu(true)

          @Override
          public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
              super.onViewCreated(view, savedInstanceState);
              setHasOptionsMenu(true);
          

          【讨论】:

            【解决方案9】:

            致电setHasOptionMenu(true)onCreateView()

            并且不要调用片段的onCreateOptionMenu()中的super.onCreateOptionsMenu(),而是调用menu.clear(),因为这会用活动的菜单覆盖现有菜单

            这在我的情况下有效。

            【讨论】:

              【解决方案10】:

              如果您在活动级别托管操作栏,或者在创建菜单的同一片段中解决它。这样您就不必将它添加到您不想显示的所有其他 Fragment 上:

              public override void OnDestroy()
              {
                  base.OnDestroy();
                  HasOptionsMenu = false;
              }
              

              【讨论】:

                【解决方案11】:

                将这些函数添加到你的 Fragment

                  @Override
                        public void onCreate(Bundle savedInstanceState) {
                            super.onCreate(savedInstanceState);
                            setHasOptionsMenu(true);
                        }
                        @Override
                        public void onPrepareOptionsMenu(Menu menu) {
                            MenuItem item=menu.findItem(R.id.delete);
                            item.setVisible(false);
                        }
                

                【讨论】:

                  【解决方案12】:

                  首先在具有工具栏的Activity 中,创建一个为您设置overflow menu 的方法:

                  public void setUpOptionMenu(Toolbar toolbar){
                      this.setSupportActionBar(toolbar);
                  }
                  

                  在您的片段onCreateView() 方法中,获取您当前活动的引用并调用您的活动setUpOptionMenu() 方法:

                  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
                      ...
                      ...
                      public void ((YourActivityName)this.getActivity()).setUpOptionMenu(null);
                      ...
                      ...
                  }
                  

                  干杯!!!

                  【讨论】:

                    【解决方案13】:

                    仅在您的片段中覆盖以下方法,它就可以解决问题。

                    @Override
                    public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
                        // Do something that differs the Activity's menu here
                        getActivity().getMenuInflater().inflate(R.menu.drawer, menu);
                    }
                    

                    【讨论】:

                      【解决方案14】:

                      只需使用findItem 找到您要隐藏的项目,然后将其可见性设置为false

                      @Override
                      public boolean onCreateOptionsMenu(Menu menu) {
                          MenuInflater inflater = getMenuInflater();
                          inflater.inflate(R.menu.main, menu);
                          MenuItem item = menu.findItem(R.id.action_settings);
                          item.setVisible(false);
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 2020-12-29
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2022-01-06
                        相关资源
                        最近更新 更多