android - studio - Cambiar íconos en ActionBar dinámicamente
personalizar action bar android studio (6)
En lugar de eliminarlos, puede ocultar el botón que no desea mostrar.
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;
}
Solo una nota, esto:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
this.invalidateOptionsMenu();
}
es necesario para actualizar la barra de acciones. Después de 3.0 dispositivos, la barra de acciones no se actualiza automáticamente. Por lo tanto, debe indicarle manualmente que llame a "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)
Tengo una Activity
que tiene una ActionBar
pero necesito cambiar dinámicamente los iconos de la ActionBar
, tengo una pausa y un botón de reproducción y necesito reemplazar el botón de reproducción con el botón de pausa mientras 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 elimino el botón Pausa y puedo agregarlo también, pero solo ocurre cuando inicio la Activity
y se dibuja la ActionBar
. ¿Cómo puedo obligar a volver a dibujar ActionBar
? Además, de esta forma, se vuelve a dibujar toda la ActionBar
. ¿Está bien? ¿Hay alguna manera de volver a dibujar solo el botón / icono que quiero?
Gracias :)
Si desea obtener el primer elemento de su menú, **
use menu.getItem(0);
este Código funciona 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;
}
Tendrá que guardar una referencia al MenuItem después de inflar. Entonces 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 puedes consultar el playMenu en cualquier momento. Por lo tanto, puede modificar el elemento diciendo que su reproductor termina de reproducirse y debe volver a un icono de reproducción.
Use el método invalidateOptionsMenu ().
private boolean isPlaying;
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.actionbarlogic, menu);
if (isPlaying) menu.removeItem(R.id.play_button);
else menu.removeItem(R.id.pause_button);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.play_button:
// Do what the play button should do here
isPlaying = true;
break;
case R.id.pause_button:
// Do what the pause button should do here
isPlaying = false;
break;
}
invalidateOptionsMenu();
return true;
}
onPrepareOptionsMenu
el onPrepareOptionsMenu
en su clase de actividad y luego puede agregar / eliminar elementos del menú visibles / invisibles.
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);
}
}
}