Cambiar los iconos en ActionBar dinámicamente

Tengo una Activity que tiene un ActionBar pero necesito cambiar los iconos en el ActionBar dinámicamente, tengo una pausa y un botón del juego y necesito substituir el botón del juego con el botón de la pausa mientras que el usuario hace clic en él. He buscado y lo encontré:

 @Override public boolean onCreateOptionsMenu(Menu menu) { if(DEBUG) Log.i("onCreateOptionsMenu()", "onCreateOptionsMenu() -> LogicAnalizerView"); //menu.add("").setIcon(R.drawable.pause).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.actionbarlogic, menu); menu.removeItem(R.id.pauseLogic); return true; } 

Así que de esta manera quito el botón de pausa y puedo añadirlo también, pero sólo sucede cuando comienzo la Activity y se dibuja la ActionBar . ¿Cómo puedo forzar a redibujar el ActionBar ? Además, de esta manera toda la ActionBar se vuelve a dibujar. ¿Está bien? ¿Hay alguna manera de volver a dibujar sólo el botón / icono que quiero?

Gracias 🙂

Tendrás que guardar una referencia al MenuItem después de hacer la inflación. Así que algo como lo siguiente:

 public boolean onCreateOptionsMenu( Menu menu ) { MenuInflater inflater = getMenuInflater(); inflater.inflate( R.menu.actionbarlogic, menu ); playMenu = menu.findItem(R.id.playMenu); updatePlayStatus(); return menu; } public void updatePlayStatus() { if( playService.isConnected() ) { playService.isPlaying() ? playMenu.setIcon(R.drawable.pause) : playMenu.setIcon(R.drawable.play); } } 

Entonces usted puede referirse al playMenu en cualquier momento. Así que usted puede modificar el elemento como decir que su jugador termina de jugar y debe volver a un icono de juego.

En lugar de eliminarlos, podría ocultar el botón que no desea que se muestre.

Por ejemplo:

 private boolean isPlaying; MenuItem mPlayMenuItem; MenuItem mPauseMenuItem; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.actionbarlogic, menu); mPlayMenuItem = menu.findItem(R.id.action_play); mPauseMenuItem = menu.findItem(R.id.action_pause); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_play: isPlaying = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { this.invalidateOptionsMenu(); } return true; case R.id.action_pause: isPlaying = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { this.invalidateOptionsMenu(); } return true; default: return super.onOptionsItemSelected(item); } } @Override public boolean onPrepareOptionsMenu (Menu menu) { super.onPrepareOptionsMenu(menu); if (isPlaying) { mPlayMenuItem.setVisible(false); // hide play button mPauseMenuItem.setVisible(true); // show the pause button } else if (!isPlaying) { mPlayMenuItem.setVisible(true); // show play button mPauseMenuItem.setVisible(false); // hide the pause button } return true; } 

Sólo una nota, esto:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { this.invalidateOptionsMenu(); } 

Es necesario actualizar la barra de acción. Después de dispositivos 3.0, la barra de acción no se actualiza automáticamente. Por lo tanto, tienes que decirle manualmente que llame al "OnPrepareOptionsMenu (Menu)" para que actualice los elementos llamando al "Activity.invalidateOptionsMenu ()".

¡Espero que esto ayude!

Referencia: http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu(android.view.Menu)

http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#invalidateOptionsMenu(android.app.Activity)

 private Menu mMenu; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main_activity, menu); // Save the menu reference mMenu = menu; return super.onCreateOptionsMenu(menu); } // For example - Call when you need to change icon private void setActionIcon(boolean showWithBadge) { MenuItem item = mMenu.findItem(R.id.ITEM_ID); if(mMenu != null) { if(showWithBadge) { item.setIcon(R.drawable.IC_WITH_BADGE); } else { item.setIcon(R.drawable.IC_WITHOUT_BADGE); } } } 

Si desea obtener el primer elemento de su menú, **

use menu.getItem(0);

Este código woks perfectamente:

  @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.my_menu, menu); MenuItem m = menu.getItem(0); m.setIcon(R.drawable.your_icon_here); } return true; } 

onPrepareOptionsMenu el onPrepareOptionsMenu en su clase de actividad y, a continuación, puede agregar / quitar o elementos de menú visibles / invisibles.

  • Cómo forzar el icono de desbordamiento de barra de acción para mostrar
  • Diferente aspecto / estilo para el elemento de menú específico en ActionBar
  • ¿Cómo cambio el color de la flecha hacia arriba de la barra de acciones?
  • Cómo cambiar el color de las pestañas de navegación de ActionBar?
  • Color de divisor de selección de pestañas de barra de acción
  • Auto Collapse ActionBar SearchView en Soft Keyboard cerrar
  • Personalizar Android ActionBar
  • Ocultar sólo la barra de acciones en las pestañas de la barra de acción de desplazamiento no
  • ¿Puedo desactivar la navegación de ActionBar Spinner?
  • Utilizando la barra de herramientas home as up button, la actividad de inicio saveInstanceState siempre es nula
  • Evita cancelar el modo de acción pulsando el botón de retroceso
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.