tutorial studio menus hacer example español ejemplos desplegable crear contextual context como android android-actionbar android-menu

studio - ¿Cómo activar/hacer clic en un elemento de menú en Android mediante programación?



menu android (8)

Tengo estos elementos de menú en mi 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>

Y tengo esto en mi método 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); }

Lo he intentado con:

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

Pero la referencia de actionRestart no ofrece nada como click , trigger , etc.

También me gustaría tener en cuenta que soy nuevo en el desarrollo de Android y que provengo de PHP / JavaScript, por lo que este nivel de Java OOP es nuevo para mí.


  1. Hacer menú global

    public Menu mMenu;

  2. Asignar menú a mMenu mientras reemplaza onCreateOptionMenu

    @Override public boolean onCreateOptionsMenu(Menu menu) { this.mMenu = menu; return super.onCreateOptionsMenu(menu); }

  3. Evento de llamada como este:

    if(mMenu != null) { MenuItem action = mMenu.findItem(R.id.action_restart); if(action != null) { onOptionsItemSelected(action); } }


Aunque no es la mejor manera de hacerlo,

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


Debe llamar manualmente a su oyente, con el elemento requerido como parámetro.

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


Hay un método estándar para hacer esto -
Cree una nueva instancia de la clase MenuItem y cambie el método anulado getItemId() para devolver el ID del elemento de menú deseado y dejar el resto sin cambios.

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


Me gustaría compartir mi solución también aquí. En lugar de intentar hacer clic en un elemento del menú mediante programación, creé un método separado para hacer clic en el elemento del menú y lo llamé en cualquier lugar donde deba hacer clic en el elemento del menú. OnOptionsItemSelected método OnOptionsItemSelected tiene el siguiente aspecto. Como puede ver, moví la lógica de clics a un método separado.

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

Ahora puede llamar a homeClicked cualquier momento que necesite hacer clic en el elemento del menú mediante programación.


Que yo sepa, no hay ningún mecanismo en el SDK que le permita hacer esto. Ciertamente no es una práctica estándar hacer este tipo de cosas.

Recomiendo desacoplar su lógica de la IU real tanto como sea posible, para que no tenga que simular un clic para desencadenar la acción. Ya que eres un desarrollador web, esto debería ser bastante fácil para ti.

En este caso, querría refactorizar los brindis en un método separado (o en múltiples métodos), y luego llamar a ambos cuando se hace clic en el elemento del menú y cuando se quiere activar manualmente.

Alternativamente , puede intentar tomar el MenuItem devuelto por findViewById () y pasarlo a su controlador allí. Pero no tengo idea de si eso funcionará.


Según su ejemplo para el elemento de menú anterior:

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

use el método callOnClick() :

((ActionMenuItemView)findViewById(R.id.action_restart)).callOnClick();


Use el método performIdentifierAction , como este:

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