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?
- El menú de la barra de acciones muestra la pantalla
- Los elementos de menú no se muestran en la barra de acciones
- Android eliminar icono de la aplicación barra de acción
- Cómo mostrar el fragmento seleccionado en la pestaña de la barra de acción
- Cómo cambiar el texto en la barra de acción
Gracias 🙂
- Android: La barra de acción predeterminada se está poblando mientras se carga la aplicación
- Control dinámico de elementos de acción / menú en ActionBar
- Altura de la pantalla sin barra de estado, barra de acción y pestañas
- Cómo personalizar Android ActionBar para mostrar una vista personalizada antes de las pestañas?
- Icono del menú que no se muestra en la barra de acción
- Android ActionBar - Presiona la vista personalizada hasta la parte inferior de la pantalla
- Número de pestañas en ActionBar
- Eliminar el icono de la aplicación y el texto de ActionBar
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)
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.
- Problema al ordenar la pila de actividades al iniciar la aplicación desde el instalador de aplicaciones para Android y desde la pantalla de inicio
- Cómo detener a Eclipse de intentar ejecutar archivos XML?