androidandroid-fragmentsandroid-optionsmenu

How to add Options Menu to Fragment in Android


I am trying to add an item to the options menu from a group of fragments.

I have created a new MenuFragment class and extended this for the fragments I wish to include the menu item in. Here is the code:

Java:

public class MenuFragment extends Fragment {

    MenuItem fav;

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

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        fav = menu.add("add");
        fav.setIcon(R.drawable.btn_star_big_off);
    }
}

Kotlin:

class MenuFragment : Fragment {

    lateinit var fav: MenuItem

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        fav = menu.add("add");
        fav.setIcon(R.drawable.btn_star_big_off);
    }
}

For some reason the onCreateOptionsMenu appears not to run.


Solution

  • 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.