it-swarm.com.ru

Как программно вызвать/нажать на элемент меню в 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, поэтому этот уровень Java OOP для меня нов.

20
omerowitz

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

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

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

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

8
Veselin Romić

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

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

Используйте метод executeIdentifierAction , Вот так:

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

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

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

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

7
Turdaliev Nursultan

Хотя это не самый лучший способ сделать,

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);
4
Ajay Shrestha
  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);
        }
    }
    
2
DenVik

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

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

используйте метод callOnClick():

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