SwiftiSwift
SwiftiSwift

Reputation: 8767

onCreateOptionsMenu not being called

onCreateOptionsMenu does not get called in a fragment. I have to manually call setHasOptionsMenu(true) in onCreatedView() but this causes the item.itemId be an empty String "" in the onOptionsItemSelected() and therefore i can't detect which menu item was tapped.

I'm currently using this in a fragment:

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)
    inflater.inflate(R.menu.menu_font_share, menu)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        R.id.menu_font_size_Btn -> {

        }
        R.id.menu_share_Btn -> {
            super.showShareSheet()
        }
    }

    return super.onOptionsItemSelected(item)
}

Upvotes: 4

Views: 5270

Answers (4)

Aegir
Aegir

Reputation: 972

Fragment-owned app bar: In case you have your Toolbar defined in your Fragment layout and not in the layout of the parent Activity, you should use the Toolbar APIs to inflate the menu. (Fragment menu APIs are appropriate only for activity-owned app bars)

Fragment Layout

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    ... />

Fragment

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

    ...
    val toolbar = binding.toolbar
    toolbar.inflateMenu(R.menu.sample_menu)
    toolbar.setOnMenuItemClickListener {
            when (it.itemId) {
                R.id.action_settings -> {
                    // Navigate to settings screen
                    true
                }
                R.id.action_done -> {
                    // Save profile changes
                    true
                }
                else -> false
            }
        }

    //set item visibility
    toolbar.menu.findItem(R.id.action_done).isVisible = ...
    ...
}

Upvotes: 1

Arrowsome
Arrowsome

Reputation: 2859

To make onCreateOptionsMenu work inside your fragment you can follow the below steps:

Be sure to set your Toolbar as ActionBar (if using one):

styles.xml

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    ...
</style>

In your Activity's onCreate:

setSupportActionBar(my_toolbar)

Without this line, onOptionsItemSelected event won't run inside your fragment. This assigns all the ActionBar callbacks to Toolbar.

In your fragments onViewCreated or onCreateView :

setHasOptionsMenu(true)

And also override this method:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when (item.id) {
        R.id.item_01 -> {}
        R.id.item_02 -> {}
        ...
    }
    super.onCreateOptionsMenu(menu, inflater)
}

If you are using Android Navigation Component add this in your Activity:

setupActionBarWithNavController(navController)

Upvotes: 3

Sasi Kumar
Sasi Kumar

Reputation: 13358

 override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu, menu)
    return true
}

 override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle item selection
    return when (item.getItemId()) {
        R.id. menu_font_size_Btn -> {
           //your TODO
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
   }

Upvotes: 0

Joker
Joker

Reputation: 151

Call super.onCreateOptionsMenu(menu,inflater) after menu inflate

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.menu_font_share, menu)
    super.onCreateOptionsMenu(menu,inflater)
}

This may more help Ref :: https://stackoverflow.com/a/15654039/11393354

try this,

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

And in onCreate add this line to make the options appear in your Toolbar

setHasOptionsMenu(true);

Upvotes: 4

Related Questions