Как программно запускать / нажимать на 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 является для меня совершенно новым.

Насколько я знаю, в SDK нет механизма, который позволит вам это сделать. Конечно, это не стандартная практика.

Я рекомендую как можно больше развязать свою логику с фактическим интерфейсом, поэтому вам не нужно симулировать щелчок, чтобы вызвать действие. Поскольку вы являетесь веб-разработчиком, это должно быть довольно легко для вас.

В этом случае вы хотите реорганизовать тосты в отдельный метод (или несколько методов), а затем вызвать это как при щелчке элемента меню, так и при его ручном нажатии.

Кроме того , вы можете попробовать взять MenuItem, возвращенный findViewById (), и передать его своему обработчику. Но я не знаю, будет ли это работать.

Вы должны вручную вызвать своего слушателя, указав требуемый элемент в качестве параметра.

 MenuItem actionRestart = (MenuItem) findViewById(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 любое время, когда вам нужно щелкнуть пункт меню программно.

Хотя это не лучший способ сделать,

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

Используйте метод performIdentifierAction , например:

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

Для этого существует стандартный метод –
Создайте новый экземпляр класса MenuItem и измените переопределенный метод getItemId() чтобы вернуть идентификатор нужного пункта меню и оставить остальным без изменений.

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