Как программно запускать/нажимать на MenuItem в Android?

У меня есть эти пункты меню в 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>

И у меня это в моем методе onOptionsItemSelected:

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

Я пробовал с:

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

Но ссылка actionRestart не предлагает ничего подобного click, trigger и т.д.

Я также хотел бы отметить, что я новичок в разработке Android, и я исхожу из фона PHP/JavaScript, поэтому этот уровень OOP для Java является для меня совершенно новым.

Ответ 1

Насколько я знаю, в SDK нет механизма, который позволит вам это сделать. Это, конечно, не стандартная практика для такого рода вещей.

Я рекомендую как можно больше отделить логику от фактического интерфейса, поэтому вам не нужно симулировать щелчок, чтобы вызвать действие. Поскольку вы являетесь веб-разработчиком, это должно быть довольно легко для вас.

В этом случае вы хотите реорганизовать тосты в отдельный метод (или несколько методов), а затем вызвать это как при щелчке элемента меню, так и при его ручном нажатии.

Альтернативно, вы можете попробовать взять MenuItem, возвращенный findViewById(), и передать его своему обработчику. Но я не знаю, будет ли это работать.

Ответ 2

Вы должны вручную вызвать своего слушателя с обязательным параметром в качестве параметра.

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

Ответ 3

Используйте метод выполнитьIdentifierAction, например:

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

Ответ 4

Я также хотел бы поделиться своим решением. Вместо того, чтобы пытаться щелкнуть программным образом элемент меню, я создал отдельный метод для щелчка элемента меню и назову его в любом месте, где мне нужно щелкнуть пункт меню. OnOptionsItemSelected выглядит следующим образом. Как вы можете видеть, я переместил логику щелчка на отдельный метод.

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

Теперь вы можете вызвать homeClicked в любое время, когда вам нужно программно щелкнуть пункт меню.

Ответ 5

Даже если это не лучший способ сделать,

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

just Call from any method
  onOptionsItemSelected(item_you_choice);

Ответ 6

  1. Сделать глобальное меню

    public Menu mMenu;
    
  2. Назначить меню для mMenu при переопределении onCreateOptionMenu

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        this.mMenu = menu;
        return super.onCreateOptionsMenu(menu);
    }
    
  3. Назовите событие как это:

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

Ответ 7

В соответствии с вашим примером для пункта меню выше:

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

использовать callOnClick() метод:

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

Ответ 8

Существует стандартный метод для этого -
Создайте новый экземпляр класса MenuItem и измените переопределенный метод getItemId(), чтобы вернуть идентификатор нужного пункта меню и оставить остальным без изменений.

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

                                             ...

                                           };
onOptionsItemSelected(actionRestart);