How to add Options Menu to Fragment in Android How to add Options Menu to Fragment in Android android android

How to add Options Menu to Fragment in Android


Call the super method:

Java:

    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setHasOptionsMenu(true);    }    @Override    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {        // TODO Add your menu entries here        super.onCreateOptionsMenu(menu, inflater);    }

Kotlin:

    override fun void onCreate(savedInstanceState: Bundle) {        super.onCreate(savedInstanceState)        setHasOptionsMenu(true)    }    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {        // TODO Add your menu entries here        super.onCreateOptionsMenu(menu, inflater)    }

Put log statements in the code to see if the method is not being called or if the menu is not being amended by your code.

Also ensure you are calling setHasOptionsMenu(boolean) in onCreate(Bundle) to notify the fragment that it should participate in options menu handling.


I had the same problem, but I think it's better to summarize and introduce the last step to get it working:

  1. Add setHasOptionsMenu(true) method in your Fragment's onCreate(Bundle savedInstanceState) method.

  2. Override onCreateOptionsMenu(Menu menu, MenuInflater inflater) (if you want to do something different in your Fragment's menu) and onOptionsItemSelected(MenuItem item) methods in your Fragment.

  3. Inside your onOptionsItemSelected(MenuItem item) Activity's method, make sure you return false when the menu item action would be implemented in onOptionsItemSelected(MenuItem item) Fragment's method.

An example:

Activity

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    MenuInflater inflater = getSupportMenuInflater();    inflater.inflate(R.menu.main, menu);    return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {    switch (item.getItemId()) {        case R.id.activity_menu_item:            // Do Activity menu item stuff here            return true;        case R.id.fragment_menu_item:            // Not implemented here            return false;        default:            break;    }    return false;}

Fragment

public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setHasOptionsMenu(true);    ....}@Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {    // Do something that differs the Activity's menu here    super.onCreateOptionsMenu(menu, inflater);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {    switch (item.getItemId()) {        case R.id.activity_menu_item:            // Not implemented here            return false;        case R.id.fragment_menu_item:            // Do Fragment menu item stuff here            return true;        default:            break;    }    return false;}


If you find the onCreateOptionsMenu(Menu menu, MenuInflater inflater) method is not being invoked, make sure you call the following from the Fragment's onCreate(Bundle savedInstanceState) method:

setHasOptionsMenu(true)