如何以编程方式在 Android 中的 MenuItem 上 trigger/click?

How to programmatically trigger/click on a MenuItem in 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 参考文献没有提供 clicktrigger 等内容

我还想指出,我是 Android 开发的新手,而且我来自 PHP/JavaScript 背景,所以这种 Java OOP 水平对我来说是全新的.

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

我建议尽可能将您的逻辑与实际 UI 分离,这样您最终就不会 需要 模拟点击来触发操作。由于您是 Web 开发人员,这对您来说应该很容易。

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

或者,您可以尝试获取 findViewById() 返回的 MenuItem 并将其传递给您的处理程序。但我不知道这是否行得通。

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

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

尽管这不是最好的方法,

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

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

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

                                             ...

                                           };
onOptionsItemSelected(actionRestart);

我也想在这里分享我的解决方案。我没有尝试以编程方式单击菜单项,而是为菜单项单击创建了一个单独的方法,并在需要单击菜单项的任何地方调用它。 OnOptionsItemSelected 方法如下所示。如您所见,我将点击逻辑移到了一个单独的方法中。

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

现在您可以在需要以编程方式单击菜单项的任何时候调用 homeClicked

使用方法performIdentifierAction,像这样:

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

根据上面菜单项的示例:

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

使用callOnClick()方法:

((ActionMenuItemView)findViewById(R.id.action_restart)).callOnClick();
  1. 创建全局菜单

    public Menu mMenu;
    
  2. 在覆盖 onCreateOptionMenu 时将菜单分配给 mMenu

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

不确定这是否是最好的方法,但我是这样做的。

BottomNavigationItemView 具有方法 callOnClick().

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