Hide/Show Action Bar Option Menu Item for different fragments

匿名 (未验证) 提交于 2019-12-03 01:49:02

问题:

I have a Sherlock Fragment Activity in which there are 3 Fragments.

Fragment A, Fragment B, Fragment C are three fragments. I want to show a done option menu in Fragment B only.

And the activity is started with Fragment A. When Fragment B is selected done button is added.

@Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setHasOptionsMenu(true); }  @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {     if(!menusInflated){         inflater.inflate(R.menu.security, menu);         menusInflated=true;     }      super.onCreateOptionsMenu(menu, inflater); } 

When I again start Fragment A I want to options Menu DONE (which was set at Fragment B) for this I am doing like this

setHasOptionsMenu(false); MenuItem item = (MenuItem) menu.findItem(R.id.done_item); item.setVisible(false); 

But this is not hiding at all, also it is giving NullPointerException when Activity if first started with Fragment A.

Please let me know what is the problem.

回答1:

This is one way of doing this:

add a "group" to your menu:

then, add a

Menu menu; 

variable to your activity and set it in your override of onCreateOptionsMenu:

@Override public boolean onCreateOptionsMenu(Menu menu) {     this.menu = menu;     // inflate your menu here } 

After, add and use this function to your activity when you'd like to show/hide the menu:

public void showOverflowMenu(boolean showMenu){     if(menu == null)         return;     menu.setGroupVisible(R.id.main_menu_group, showMenu); } 

I am not saying this is the best/only way, but it works well for me.



回答2:

Try this...

You don't need to override onCreateOptionsMenu() in your Fragment class again. Menu items visibility can be changed by overriding onPrepareOptionsMenu() method available in Fragment class.

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


回答3:

To show action items (action buttons) in the ActionBar of fragments where they are only needed, do this:

Lets say you want the save button to only show in the fragment where you accept input for items and not in the Fragment where you view a list of items, add this to the OnCreateOptionsMenu method of the Fragment where you view the items:

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {      if (menu != null) {          menu.findItem(R.id.action_save_item).setVisible(false);     } } 

NOTE: For this to work, you need the onCreate() method in your Fragment (where you want to hide item button, the item view fragment in our example) and add setHasOptionsMenu(true) like this:

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

Might not be the best option, but it works and it's simple.



回答4:

This will work for sure I guess...

// Declare Menu menu; MenuItem menuDoneItem;  // Then in your onCreateOptionMenu() method write the following... @Override     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {         this.menu=menu;         inflater.inflate(R.menu.secutity, menu);             }  // In your onOptionItemSelected() method write the following... @Override     public boolean onOptionsItemSelected(MenuItem item) {         switch (item.getItemId()) {             case R.id.done_item:                 this.menuDoneItem=item;                 someOperation();                 return true;             default:                 return super.onOptionsItemSelected(item);         }     }  // Now Making invisible any menu item... public void menuInvisible(){ setHasOptionsMenu(true);// Take part in populating the action bar menu             menuDoneItem=(MenuItem)menu.findItem(R.id.done_item);                 menuRefresh.setVisible(false); // make true to make the menu item visible. }  //Use the above method whenever you need to make your menu item visible or invisiable 

You can also refer this link for more details, it is a very useful one.



回答5:

MenuItem Import = menu.findItem(R.id.Import);   Import.setVisible(false) 

For more reference, see: http://androiddhina.blogspot.in/2015/05/android-how-to-hide-menu-item-in.html



回答6:

Try this

@Override public boolean onCreateOptionsMenu(Menu menu){     MenuInflater inflater = getMenuInflater();     inflater.inflate(R.menu.custom_actionbar, menu);     menu.setGroupVisible(...); } 


回答7:

You can make a menu for each fragment, and a global variable that mark which fragment is in use now. and check the value of the variable in onCreateOptionsMenu and inflate the correct menu

 @Override      public boolean onCreateOptionsMenu(Menu menu) {          if (fragment_it == 6) {              MenuInflater inflater = getMenuInflater();              inflater.inflate(R.menu.custom_actionbar, menu);          }      }  


回答8:

Even though the question is old and answered. There is a simpler answer to that than the above mentioned. You don't need to use any other variables. You can create the buttons on action bar whatever the fragment you want, instead of doing the visibility stuff(show/hide).

Add the following in the fragment whatever u need the menu item.

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {     inflater.inflate(R.menu.menu, menu);     super.onCreateOptionsMenu(menu, inflater); } 

Sample menu.xml file:

Handling onclick events is as usual.



回答9:

Hello I got the best solution of this, suppose if u have to hide a particular item at on create Menu method and show that item in other fragment. I am taking an example of two menu item one is edit and other is delete. e.g menu xml is as given below:

sell_menu.xml

 

Now Override the two method in your activity & make a field variable mMenu as:

  private Menu mMenu;         //  field variable         @Override   public boolean onCreateOptionsMenu(Menu menu) {     getMenuInflater().inflate(R.menu.sell_menu, menu);     this.mMenu = menu;      menu.findItem(R.id.action_delete).setVisible(false);     return super.onCreateOptionsMenu(menu);   }   @Override  public boolean onOptionsItemSelected(MenuItem item) {     if (item.getItemId() == R.id.action_delete) {        // do action         return true;     } else if (item.getItemId() == R.id.action_edit) {       // do action         return true;     }      return super.onOptionsItemSelected(item);  } 

Make two following method in your Activity & call them from fragment to hide and show your menu item. These method are as:

public void showDeleteImageOption(boolean status) {     if (menu != null) {         menu.findItem(R.id.action_delete).setVisible(status);     } }  public void showEditImageOption(boolean status) {     if (menu != null) {         menu.findItem(R.id.action_edit).setVisible(status);     } } 

That's Solve from my side,I think this explanation will help you.



回答10:

Late to the party but the answers above didn't seem to work for me.

My first tab fragment (uses getChildFragmentManager() for inner tabs) has the menu to show a search icon and uses android.support.v7.widget.SearchView to search within the inner tab fragment but navigating to other tabs (which also have inner tabs using getChildFragmentManager()) would not remove the search icon (as not required) and therefore still accessible with no function, maybe as I am using the below (ie outer main tabs with each inner tabs)

getChildFragmentManager();  

However I use the below in my fragments containing/using the getChildFragmentManager() for inner tabs.

    //region onCreate     @Override     public void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);     setRetainInstance(true);      //access setHasOptionsMenu()     setHasOptionsMenu(true);      }     //endregion onCreate 

and then clear the menu item inside onPrepareOptionsMenu for fragments(search icon & functions)

    @Override     public void onPrepareOptionsMenu(Menu menu) {      super.onPrepareOptionsMenu(menu);      //clear the menu/hide the icon & disable the search access/function ...     //this will clear the menu entirely, so rewrite/draw the menu items after if needed     menu.clear();      } 

Works well and navigating back to the tab/inner tab with the search icon functions re displays the search icon & functions.

Hope this helps...



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!