2012-06-13 17 views
49

que tienen un Activity que tiene una ActionBar pero necesitan cambiar los iconos de la ActionBar dinámicamente, tengo una pausa y un botón juego y yo tenga que reemplazar el botón juego con el botón pause mientras el usuario hace clic en él. He buscado y he encontrado:Cambiar iconos en la Barra de acciones dinámicamente

@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í de esta manera que elimine el botón de pausa y puedo añadir que también, pero sólo ocurrirá cuando inicio el Activity y la ActionBar se dibuja. ¿Cómo puedo obligar a volver a dibujar el ActionBar? Además, de esta manera se vuelve a dibujar el ActionBar completo. ¿Está bien? ¿Hay alguna manera de volver a dibujar solo el botón/icono que quiero?

Gracias :)

+7

http://developer.android.com/guide/topics/ui/menus.html - Este enlace en realidad tiene una sección de "cambio de elementos de menú en tiempo de ejecución". – trumpetlicks

+1

Gracias funcionó perfectamente y parece la forma correcta de hacerlo :) – Andres

Respuesta

44

Vas a tener que guardar fuera una referencia a la Menultem 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); 
    } 
} 

Luego puede consultar el playMenu en cualquier momento. Por lo tanto, puede modificar el elemento diciendo que su reproductor termina de reproducirse y debe regresar al ícono de reproducción.

+1

Gracias, pero lo hago funcionar con el enlace de los desarrolladores de Android :) – Andres

+0

¿Qué es PlayService? –

+0

@NeonWarge Es su propio código. Simplemente ignóralo. Solo tienes que concentrarte en 'playMenu'. – chjarder

9
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); 
     } 
    } 
} 
2

anular el onPrepareOptionsMenu en su clase de actividad y entonces usted puede añadir/eliminar o elementos de menú visibles/invisibles.

15

En lugar de eliminarlos, puede 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(); 
} 

se requiere para actualizar la barra de acción. 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)

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

2

Si usted desea conseguir el primer punto de su menú, **

use menu.getItem(0);

woks perfectamente este código:

@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; 
} 
Cuestiones relacionadas