如何以编程方式在 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
参考文献没有提供 click
、trigger
等内容
我还想指出,我是 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();
创建全局菜单
public Menu mMenu;
在覆盖 onCreateOptionMenu 时将菜单分配给 mMenu
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
this.mMenu = menu;
return super.onCreateOptionsMenu(menu);
}
像这样调用事件:
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();
我的 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 水平对我来说是全新的.
据我所知,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();
创建全局菜单
public Menu mMenu;
在覆盖 onCreateOptionMenu 时将菜单分配给 mMenu
@Override public boolean onCreateOptionsMenu(Menu menu) { this.mMenu = menu; return super.onCreateOptionsMenu(menu); }
像这样调用事件:
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();