Как программно запускать/нажимать на MenuItem в 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, поэтому этот уровень OOP для Java является для меня совершенно новым.
Ответы
Ответ 1
Насколько я знаю, в SDK нет механизма, который позволит вам это сделать. Это, конечно, не стандартная практика для такого рода вещей.
Я рекомендую как можно больше отделить логику от фактического интерфейса, поэтому вам не нужно симулировать щелчок, чтобы вызвать действие. Поскольку вы являетесь веб-разработчиком, это должно быть довольно легко для вас.
В этом случае вы хотите реорганизовать тосты в отдельный метод (или несколько методов), а затем вызвать это как при щелчке элемента меню, так и при его ручном нажатии.
Альтернативно, вы можете попробовать взять MenuItem, возвращенный findViewById(), и передать его своему обработчику. Но я не знаю, будет ли это работать.
Ответ 2
Вы должны вручную вызвать своего слушателя с обязательным параметром в качестве параметра.
MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart);
onOptionsItemSelected(actionRestart);
Ответ 3
Используйте метод выполнитьIdentifierAction,
например:
menu.performIdentifierAction(R.id.action_restart, 0);
Ответ 4
Я также хотел бы поделиться своим решением. Вместо того, чтобы пытаться щелкнуть программным образом элемент меню, я создал отдельный метод для щелчка элемента меню и назову его в любом месте, где мне нужно щелкнуть пункт меню. 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;
}
just Call from any method
onOptionsItemSelected(item_you_choice);
Ответ 6
-
Сделать глобальное меню
public Menu mMenu;
-
Назначить меню для mMenu при переопределении onCreateOptionMenu
@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);
}
}
Ответ 7
В соответствии с вашим примером для пункта меню выше:
<item android:id="@+id/action_restart" android:title="Restart"
android:orderInCategory="1" />
использовать callOnClick()
метод:
((ActionMenuItemView)findViewById(R.id.action_restart)).callOnClick();
Ответ 8
Существует стандартный метод для этого -
Создайте новый экземпляр класса MenuItem
и измените переопределенный метод getItemId()
, чтобы вернуть идентификатор нужного пункта меню и оставить остальным без изменений.
MenuItem actionRestart = new MenuItem() {
@Override
public int getItemId() {
return R.id.action_restart;
}
...
};
onOptionsItemSelected(actionRestart);