Zlatan Omerovic
Zlatan Omerovic

Reputation: 4097

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

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.

Upvotes: 44

Views: 34740

Answers (9)

Simon
Simon

Reputation: 2066

Use the method performIdentifierAction, like this:

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

Upvotes: 56

lcompare
lcompare

Reputation: 997

Not sure if this is the best way, but here is how I did it.

BottomNavigationItemView has the method callOnClick().

BottomNavigationItemView menuItem = findViewById(R.id.navigation_take_post);
menuItem.callOnClick();

Upvotes: 2

Ajay Shrestha
Ajay Shrestha

Reputation: 2455

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);

Upvotes: 6

DenVik
DenVik

Reputation: 79

  1. Make global Menu

    public Menu mMenu;
    
  2. Assign menu to mMenu while override onCreateOptionMenu

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        this.mMenu = menu;
        return super.onCreateOptionsMenu(menu);
    }
    
  3. Call event like this:

    if(mMenu != null) {
        MenuItem action = mMenu.findItem(R.id.action_restart);
    
        if(action != null) {
            onOptionsItemSelected(action);
        }
    }
    

Upvotes: 4

Matt
Matt

Reputation: 459

As per your example for menu item above :

<item android:id="@+id/action_restart" android:title="Restart"
        android:orderInCategory="1" />

use callOnClick() method :

((ActionMenuItemView)findViewById(R.id.action_restart)).callOnClick();

Upvotes: 2

Turdaliev Nursultan
Turdaliev Nursultan

Reputation: 2576

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.

Upvotes: 10

Shivendra
Shivendra

Reputation: 566

There is a standard method to do this -
Create a new instance of MenuItem class and change the overridden method getItemId() to return the id of desired menu item and leave the rest unchanged.

MenuItem actionRestart = new MenuItem() {
                                             @Override
                                             public int getItemId() {
                                               return R.id.action_restart;
                                             }

                                             ...

                                           };
onOptionsItemSelected(actionRestart);

Upvotes: -3

VadymVL
VadymVL

Reputation: 5566

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

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

Upvotes: 17

Veselin Romić
Veselin Romić

Reputation: 700

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.

Upvotes: 10

Related Questions