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 eliminar la flecha izquierda de la barra de acción en android?
  • Personalizar Android ActionBar
  • Cambiar el color de fondo de ActionBar en el código de la lista de navegación
  • Agregue progreso horizontal indeterminado a la barra de acción
  • Android ActionBar NullPointerException
  • ActionBar MenuItem Divider
  • Cambiar el color del menú de menú por color mediante programación
  • Número en barra de acciones como Gmail
  • Personalización de android.widget.SearchView
  • Barra de pestañas ActionBar apilada que no rellena el padre
  • Establecer la altura del icono de la barra de acciones para que coincida con la altura de la barra de acciones
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.