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?
- "No se encontró ningún identificador de recurso para el atributo 'showAsAction' en el paquete 'android'"
- Manténgase en la pestaña actual después de cambiar la orientación Actionbar Android
- Android: Icono de búsqueda que no se muestra en la barra de acciones
- ¿Cómo declaro una barra de herramientas / barra de acción de altura extendida en Android Lollipop?
- ActionBar y ActionBar.Tab y el cajón de navegación android
Gracias 🙂
- Eliminando la sombra inferior en ActionBar - Android
- Android: Barra de acción personalizada, ¿Cómo usar todo el ancho?
- Altura de la pantalla sin barra de estado, barra de acción y pestañas
- Número de pestañas en ActionBar
- ActionBarDrawerToggle v7 o v4?
- Actividad del asistente de actividad de pantalla completa. ¿Cómo dejo de mostrar la barra de acción cuando interactúo con el dispositivo?
- Cambiar el color de fondo de ActionBar dinámicamente
- Android: setActionView (null) no elimina problemas de vista y anchura en MenuItem con ActionView
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?