J'utilise le tiroir de menu qui a plus Fragment
s. Dans certains Fragment
s, 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);
}
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
.
Activity
s et Fragment
s peuvent avoir chacun leur propre menu. Voir ce link .
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);
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);
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();
}
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);
}
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);
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;
}