androidactionbarsherlockandroid-fragmentactivity

Hide/Show Action Bar Option Menu Item for different fragments


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.


Solution

  • This is one way of doing this:

    add a "group" to your menu:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <group
            android:id="@+id/main_menu_group">
             <item android:id="@+id/done_item"
                  android:title="..."
                  android:icon="..."
                  android:showAsAction="..."/>
        </group>
    </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.