Android: cambiar los elementos del menú de opciones mediante programación

¿Es posible cambiar los elementos del menú de opciones de forma programática? ¿Puede alguien darme un ejemplo, por favor? Además, quiero deshabilitar ciertos elementos, para que no escuchen los clics, ¿es posible?

Gracias.

Para cualquier persona necesita cambiar las opciones del menú dinámicamente:

private Menu menu; // ... @Override public boolean onCreateOptionsMenu(Menu menu) { this.menu = menu; getMenuInflater().inflate(R.menu.options, menu); return true; } // ... private void hideOption(int id) { MenuItem item = menu.findItem(id); item.setVisible(false); } private void showOption(int id) { MenuItem item = menu.findItem(id); item.setVisible(true); } private void setOptionTitle(int id, String title) { MenuItem item = menu.findItem(id); item.setTitle(title); } private void setOptionIcon(int id, int iconRes) { MenuItem item = menu.findItem(id); item.setIcon(iconRes); } 

Menu.xml

  <item android:id="@+id/item1" android:title="your Item"> </item> 

Poner en su archivo java

  public void onPrepareOptionsMenu(Menu menu) { menu.removeItem(R.id.item1); } 

Al igual que Nikolay dijo hacer eso en onPrepareOptionsMenu ().

Para los elementos de menú en la barra de acción, tiene que invalidar el menú con activity.invalidateOptionsMenu();

Esto se describe con más detalle aquí ¿Cómo puedo actualizar el ActionBar cuando onPrepareOptionsMenu cambiar entradas de menú?

Si tengo que cambiar el contenido de mi menú de opciones, lo realizo durante el programa onMenuOpened (). Esto me permite comprobar el estado de ejecución en el momento mismo en que el usuario accede al menú.

 public boolean onMenuOpened(int featureid, Menu menu) { menu.clear(); if (!editable) { MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign)); MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify)); MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete)); itemAdd.setShortcut('0', 'a'); itemMod.setShortcut('1', 'm'); itemDel.setShortcut('2', 'd'); } else { MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges)); itemSave.setShortcut('0', 'S'); } return true; } 

Para deshabilitar ciertos elementos:

 MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML); item.setEnabled(false); 

Pruebe este código:

 @Override public boolean onPrepareOptionsMenu(Menu menu) { this.menu=menu; updateMenuItems(menu); return super.onPrepareOptionsMenu(menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.document_list_activity_actions, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items if (item.getItemId() == android.R.id.home) { onHomeButtonPresssed(); }else if (item.getItemId() == R.id.action_delete) { useCheckBoxAdapter=false; deleteDocuments(); } else if (item.getItemId() == R.id.share) { useCheckBoxAdapter=false; shareDocuments(); } else if (item.getItemId() == R.id.action_tick) { useCheckBoxAdapter=true; onShowCheckboxes(); } updateMenuItems(menu); return true; } private void updateMenuItems(Menu menu){ if (useCheckBoxAdapter && menu != null) { menu.findItem(R.id.action_delete).setVisible(true); menu.findItem(R.id.share).setVisible(true); menu.findItem(R.id.action_tick).setVisible(false); } else { menu.findItem(R.id.action_delete).setVisible(false); menu.findItem(R.id.share).setVisible(false); menu.findItem(R.id.action_tick).setVisible(true); } invalidateOptionsMenu(); } 

Utilizando las siguientes líneas que he hecho para agregar los valores en el menú

 getActivity().invalidateOptionsMenu(); 

Prueba este trabajo como un encanto para mí.

Puedes hacer algo sencillo como yo. Simplemente cambie el texto a lo que se necesita cuando se toca el elemento del menú. Necesitaba encender y apagar el sonido, además de la capacidad de realizar una acción al tocarlo. Aquí está mi código:

  @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.audioOn: audioOn = !audioOn; if (audioOn) item.setTitle("Audio Off"); else item.setTitle("Audio On"); return true; case R.id.touchOn: touchOn = !touchOn; if (touchOn) item.setTitle("Touch Off"); else item.setTitle("Touch On"); return true; default: return super.onOptionsItemSelected(item); } } 

AudioOn y touchOn son booleanos verificados en otras partes del código. Espero que esto ayude.

En caso de que tenga una BottomBar:

 @Override public boolean onCreateOptionsMenu(Menu menu) { if (mBottomBar.getCurrentTabId() == R.id.tab_more) { getMenuInflater().inflate(R.menu.more_menu, menu); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.preferences: startActivity(new Intent(this, PreferenceActivity.class)); break; } return super.onOptionsItemSelected(item); } 

Entonces sólo tienes que llamar a:

 @Override public void onBottomBarClick(int tabId) { supportInvalidateOptionsMenu(); } 

Usted puede lograr su tarea simplemente implementando como abajo:

 private Menu menu; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.drive_menu, menu); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { this.menu = menu; return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_toggle_grid) { handleMenuOption(id); return true; } else if(id == R.id.action_toggle_list){ handleMenuOption(id); return true; } return super.onOptionsItemSelected(item); } private void handleMenuOption(int id) { MenuItem item = menu.findItem(id); if (id == R.id.action_toggle_grid){ item.setVisible(false); menu.findItem(R.id.action_toggle_list).setVisible(true); }else if (id == R.id.action_toggle_list){ item.setVisible(false); menu.findItem(R.id.action_toggle_grid).setVisible(true); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.