Search code examples
androidandroid-fragmentsandroid-actionbarandroid-toolbarlayout-inflater

onCreateOptionsMenu is never called (toolbar inflate)


My Fragment class:

Toolbar toolbar;

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    toolbar =  getView().findViewById(R.id.toolbar3);
    toolbar.inflateMenu(R.menu.menufragmentmain);
    setHasOptionsMenu(true); //i also tried putting this function in oncreate function
}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Toast.makeText(getActivity(), "i never enter this function also" , Toast.LENGTH_LONG).show();
    super.onCreateOptionsMenu(menu,inflater);
    inflater.inflate(R.menu.menufragmentmain, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Toast.makeText(getActivity(), "i never enter this function" , Toast.LENGTH_LONG).show();
    //some switch cases.....
    return super.onOptionsItemSelected(item);
}

I've got a stupid error which I cant find unfourtantly. I've got a simple toolbar for my fragment. In onViewCreated I inflate my actionbar menu with my toolbar. The issue is that the functions onCreateOptionsMenu and 'onOptionsItemSelected' are never called. I've got no clue why.

Things i checked in other similar questions with the same issue:

  • I checked if my main activity has a onCreateOptionsMenu or'onOptionsItemSelected'. It doesn*t
  • Checked if my style class has NOT: android:theme="@android:style/Theme.Black.NoTitleBar

None of the points unfourtantly work. What did I miss. Do I need to check something else?


Solution

  • As per the Fragment-owned app bar guide which explains how to use a Fragment-owned Toolbar, you do not use any of the setHasOptionsMenu(), onCreateOptionsMenu(), or onOptionsItemSelected() APIs - those are only used for activity owned app bars.

    Instead, you would follow the guide for handling menu click events by using the Toolbar APIs:

    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        toolbar =  getView().findViewById(R.id.toolbar3);
        toolbar.inflateMenu(R.menu.menufragmentmain);
    
        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(getActivity(), "onMenuItemClick called" , Toast.LENGTH_LONG).show();
                //some switch cases.....
                return true;
            }
        });
    }