我在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对我来说都是新手。
使用方法performIdentifierAction,如下所示:
menu.performIdentifierAction(R.id.action_restart, 0);
您应该手动调用您的侦听器,并将必需的项目作为参数。
MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart);
onOptionsItemSelected(actionRestart);
据我所知,SDK中没有允许您执行此操作的机制。做这种事情当然不是标准做法。
我建议尽可能地将您的逻辑与实际UI分离,这样您最终不需要模拟单击来触发操作。由于您是一名Web开发人员,因此您可以轻松应对。
在这种情况下,您需要将toast重构为单独的方法(或多个方法),然后在单击菜单项和手动触发时调用它。
或者,您可以尝试使用findViewById()返回的MenuItem并将其传递给您的处理程序。但我不知道这是否有效。
我想在这里分享我的解决方案。我没有尝试以编程方式单击菜单项,而是创建了一个单独的菜单项单击方法,并在需要单击菜单项的任何位置调用它。 OnOptionsItemSelected
方法如下所示。如您所见,我将单击逻辑移动到单独的方法。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
homeClicked();
}
return super.onOptionsItemSelected(item);
}
private void homeClicked(){
...
}
现在,您可以在需要以编程方式单击菜单项时随时调用homeClicked
。
虽然这不是最好的方法,
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);
public Menu 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);
}
}
根据上面菜单项的示例:
<item android:id="@+id/action_restart" android:title="Restart"
android:orderInCategory="1" />
使用callOnClick()
方法:
((ActionMenuItemView)findViewById(R.id.action_restart)).callOnClick();
有一种标准方法可以做到这一点 -
创建一个MenuItem
类的新实例,并更改重写方法getItemId()
以返回所需菜单项的id,并保持其余不变。
MenuItem actionRestart = new MenuItem() {
@Override
public int getItemId() {
return R.id.action_restart;
}
...
};
onOptionsItemSelected(actionRestart);