How to programmatically trigger/click on a MenuItem in Android?

29,973

Solution 1

Use the method performIdentifierAction, like this:

menu.performIdentifierAction(R.id.action_restart, 0);

Solution 2

You should manually call your listener, with required item as parameter.

MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart);
onOptionsItemSelected(actionRestart);

Solution 3

As far as I know, there is no mechanism in the SDK that lets you do this. It's certainly not standard practice to do this sort of thing.

I recommend decoupling your logic from the actual UI as much as possible, so you end up not needing to simulate a click to trigger the action. Since you're a Web developer, this should come fairly easily to you.

In this case, you'd want to refactor the toasts into a separate method (or multiple methods), and then call that both when the menu item is clicked and when you want to trigger it manually.

Alternatively, you could try taking the MenuItem returned by findViewById() and passing it to your handler there. But I have no idea if that'll work.

Solution 4

I would like to share my solution as well here. Instead of trying to click programmatically a menu item, I created a separate method for menu item click, and call it anywhere where I need to click menu item. OnOptionsItemSelected method looks as follows. As you can see I moved click logic to a separate method.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        homeClicked();
    }
    return super.onOptionsItemSelected(item);
}
private void homeClicked(){
    ...
}

Now you can call homeClicked anytime you need to click menu item programmatically.

Solution 5

Even though it's not the best way to do,

MenuItem item_your_choice;

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.your_menu, menu);
    item_your_choice = menu.findItem(R.id.item_your_choice);
    return super.onCreateOptionsMenu(menu);
}

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case item_your_choice:
           //do whatever you want
            break;
        }
   return super.onOptionsItemSelected(item);
}

just Call from any method

onOptionsItemSelected(item_you_choice);
Share:
29,973
Zlatan Omerović
Author by

Zlatan Omerović

A%L(e)

Updated on January 24, 2021

Comments

  • Zlatan Omerović
    Zlatan Omerović over 3 years

    I have these menu items in my menu_main.xml

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context=".MainActivity">
    
        <item android:id="@+id/action_restart" android:title="Restart"
            android:orderInCategory="1" />
        <item android:id="@+id/action_clear" android:title="Clear"
            android:orderInCategory="2" />
        <item android:id="@+id/action_update" android:title="Update"
            android:orderInCategory="3" />
        <item android:id="@+id/action_about" android:title="About"
            android:orderInCategory="4" />
        <item android:id="@+id/action_try_restart" android:title="Try Restart"
            android:orderInCategory="5" />
    </menu>
    

    And I have this in my onOptionsItemSelected method:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
    
        if (id == R.id.action_restart) {
            Toast.makeText(MainActivity.this, "Restart...", Toast.LENGTH_LONG).show();
        }
    
        if (id == R.id.action_clear) {
            Toast.makeText(MainActivity.this, "Clear...", Toast.LENGTH_LONG).show();
        }
    
        if (id == R.id.action_update) {
            Toast.makeText(MainActivity.this, "Update...", Toast.LENGTH_LONG).show();
        }
    
        if (id == R.id.action_about) {
            Toast.makeText(MainActivity.this, "About...", Toast.LENGTH_LONG).show();
        }
    
        if(id == R.id.action_try_restart) {
            // how to click / trigger the "action_restart" from here?
        }
    
        return super.onOptionsItemSelected(item);
    }
    

    I have tried with:

    MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart);
    actionRestart; //
    

    But actionRestart reference doesn't offer anything like click, trigger, etc.

    I'd also like to note that I'm new to Android development and I come from PHP/JavaScript background, so this level of Java OOP is all new to me.

  • Zlatan Omerović
    Zlatan Omerović almost 9 years
    I will try this too! I've made a separate method, as I have described in Veselin Romic's answer up above. Thank you too.
  • Pablo Cegarra
    Pablo Cegarra over 7 years
    java.lang.ClassCastException: android.support.v7.view.menu.ActionMenuItemView cannot be cast to android.view.MenuItem
  • emen
    emen over 7 years
    This will override all of the MenuItem's interface method, which makes your code messy
  • MilapTank
    MilapTank almost 7 years
    nice approach as we don't have native method
  • Simon
    Simon over 6 years
    you can use the method performIdentifierAction
  • Umar Ata
    Umar Ata over 5 years
    see @VadymVL answer, it is purely possible
  • alexanderktx
    alexanderktx about 5 years
    How can I get the [menu] from activity's [onCreate]?
  • alexanderktx
    alexanderktx about 5 years
    In my case it throws exception when I try to find the view in [onCreate] method. How can I get there?
  • Simon
    Simon about 5 years
    @p2lem8dev, you can get the menu in public boolean onCreateOptionsMenu(Menu menu)
  • Dimitri Schultheis
    Dimitri Schultheis about 4 years
    exactly what I need
  • sai Pavan Kumar
    sai Pavan Kumar almost 4 years
    you saved my day bro
  • eastwater
    eastwater almost 4 years
    the method findViewById() returns null in onCreate() method. Where the code should be put?
  • SoufianeKre
    SoufianeKre about 2 years
    This is actually works for me ,Thank you .