在某些片段中隐藏MenuItem

pav*_*nek 53 android android-fragments android-optionsmenu

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

我尝试添加覆盖onCreateOptionsMenu()Fragment我不想显示此菜单项但我无法让它工作.我尝试了许多方式在代码中看到注释行.有什么问题在哪里?当我onPrepareOptionsMenu()在MainActivity中调用时激活菜单抽屉时,最后这个菜单项会隐藏,但是当我进入时我需要这样做Fragment.

Fragment 我想要隐藏菜单项REFRESH:

 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

pra*_*kar 182

在要隐藏项目的片段中

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

并在你片段的onCreate()中

 setHasOptionsMenu(true);
Run Code Online (Sandbox Code Playgroud)

  • 应该是首选答案.为我工作就像一个魅力. (5认同)
  • 谢谢,非常简单的解决方案,它确实有效。 (2认同)
  • 那就是解决方案。谢谢 (2认同)

Lui*_*uis 42

Fragment您不想显示任何菜单选项的位置,您需要setHasOptionsMenu(false);onCreate(),如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(false);
}
Run Code Online (Sandbox Code Playgroud)

但是,您要隐藏的菜单(REFRESH)属于MainActivity.这就是它总是被展示的原因.由于您想要控制Fragment级别的菜单(而不是显示Activity选项菜单),我的建议是从中删除菜单代码Activity并在您的菜单中实现它Fragment.

Activitys和Fragments每个都有自己独立的菜单.看到这个链接.

  • 嗯没有运气我试试但菜单项仍然存在.(问题将是其他地方. (5认同)
  • 是的,我复制粘贴您的代码,因为我说它不工作菜单项仍然可见. (5认同)
  • @PavolFranek你改变了什么才能让它发挥作用?我有同样的问题.我从FragmentActivity中删除了选项菜单,只将它放在一个片段中,但它仍然显示在所有片段中. (2认同)

小智 31

请试试这个

@Override 
public void onPrepareOptionsMenu(Menu menu) {
    menu.clear();
}
Run Code Online (Sandbox Code Playgroud)

把它放在你的碎片上onCreate()

setHasOptionsMenu(true);
Run Code Online (Sandbox Code Playgroud)


小智 18

在片段类中

 @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();
    }
Run Code Online (Sandbox Code Playgroud)


小智 11

我只是使用下面的代码隐藏menuitem在fragmnet我想要使用它.注意:请阅读评论

@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);
}
Run Code Online (Sandbox Code Playgroud)


Bis*_*uit 8

在 Kotlin 中为需要它的人提供

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setHasOptionsMenu(true)
}
Run Code Online (Sandbox Code Playgroud)
override fun onPrepareOptionsMenu(menu: Menu) {
    super.onPrepareOptionsMenu(menu)
    menu.clear()
}
Run Code Online (Sandbox Code Playgroud)


小智 5

在科特林中

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

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