如何以编程方式触发/点击Android中的MenuItem?

问题描述 投票:22回答:8

我在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参考不提供任何像clicktrigger等。

我还要注意,我是Android开发的新手,我来自PHP / JavaScript背景,所以这个级别的Java OOP对我来说都是新手。

android android-actionbar android-menu
8个回答
19
投票

使用方法performIdentifierAction,如下所示:

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

16
投票

您应该手动调用您的侦听器,并将必需的项目作为参数。

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

8
投票

据我所知,SDK中没有允许您执行此操作的机制。做这种事情当然不是标准做法。

我建议尽可能地将您的逻辑与实际UI分离,这样您最终不需要模拟单击来触发操作。由于您是一名Web开发人员,因此您可以轻松应对。

在这种情况下,您需要将toast重构为单独的方法(或多个方法),然后在单击菜单项和手动触发时调用它。

或者,您可以尝试使用findViewById()返回的MenuItem并将其传递给您的处理程序。但我不知道这是否有效。


8
投票

我想在这里分享我的解决方案。我没有尝试以编程方式单击菜单项,而是创建了一个单独的菜单项单击方法,并在需要单击菜单项的任何位置调用它。 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;
        }
   return super.onOptionsItemSelected(item);
}

只需从任何方法调用

onOptionsItemSelected(item_you_choice);

2
投票
  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); } }

0
投票

根据上面菜单项的示例:

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

使用callOnClick()方法:

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

-3
投票

有一种标准方法可以做到这一点 - 创建一个MenuItem类的新实例,并更改重写方法getItemId()以返回所需菜单项的id,并保持其余不变。

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

                                             ...

                                           };
onOptionsItemSelected(actionRestart);
© www.soinside.com 2019 - 2024. All rights reserved.