web-dev-qa-db-fra.com

Masquer MenuItem dans certains fragments

J'utilise le tiroir de menu qui a plus Fragments. Dans certains Fragments, j'ai l'élément de menu REFRESH mais dans certains fragments, je veux masquer cet élément de menu (je ne veux pas afficher le menu mais je ne veux pas masquer ActionBar).

J'essaie d'ajouter le remplacement onCreateOptionsMenu() à Fragment où je ne veux pas afficher cet élément de menu mais que je ne parviens pas à le faire fonctionner. J'essaie de nombreuses manières de voir la ligne commentée dans le code. Est-ce qu'une idée où est le problème? Et enfin, cet élément de menu va se masquer lorsque j'active le tiroir de menu lorsque s'appelle onPrepareOptionsMenu() dans MainActivity mais que je dois le faire lorsque je suis dans Fragment.

Fragment où je veux masquer l'élément de menu 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);
    }
}

MainActivity où est défini MENU TIROIR:

 //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);
}
44
pavol.franek

Dans la Fragment où vous ne voulez afficher aucune option de menu, vous avez besoin de setHasOptionsMenu(false); dans la onCreate(), comme ceci:

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

Cependant, le menu affiché que vous souhaitez masquer (REFRESH) appartient à MainActivity. C'est pourquoi il est toujours montré. Puisque vous voulez contrôler le menu au niveau Fragment (et ne pas afficher un menu d'options Activity), ma suggestion est de supprimer le code de menu de la Activity et de le mettre en œuvre dans votre Fragment.

Activitys et Fragments peuvent avoir chacun leur propre menu. Voir ce link .

36
Luis

Dans le fragment où vous souhaitez masquer l'élément 

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

et dans onCreate () de votre fragment 

 setHasOptionsMenu(true);
149
pratham kesarkar

s'il vous plaît essayez ceci

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

et mettez ceci sur onCreate () de votre fragmen

setHasOptionsMenu(true);
24
Sandy Akbar

En classe de fragment  

 @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();
    }
13
Divyesh Murani

Je viens d’utiliser le code ci-dessous pour cacher menuitem dans un fragment où je ne veux pas l’utiliser ..

@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);
}
11
Android27

Il existe de nombreuses versions de solutions similaires mais, malheureusement, aucune d’elles n’a fonctionné pour moi. Je partage ce qui m'a finalement été utile pour masquer le menu de débordement avec plusieurs éléments de menu. Je pense que c'est utile pour n'importe qui. 

J'ai groupé mes menus avec un id et ensuite référé que id

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

Si vous souhaitez masquer un élément de menu individuel, vous pouvez utiliser 

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

Ce qui est important, c’est que vous devriez avoir setOptionsMenu(true) dans onViewCreated()

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

Ou résolvez-le dans le même fragment qui a créé le menu, si vous hébergez la barre d'actions au niveau de l'activité De cette façon, vous n'avez pas besoin de l'ajouter à tous les autres fragments où vous ne voulez pas le montrer: 

public override void OnDestroy()
{
    base.OnDestroy();
    HasOptionsMenu = false;
}
0
Henk-Martijn