2012-06-13 12 views
49

ho un Activity che ha un ActionBar ma ho bisogno di cambiare le icone sul ActionBar dinamicamente, ho un pausa e un pulsante gioco e ho bisogno di sostituire il tasto gioco con il pulsante pause mentre l'utente fa clic su di esso. Ho cercato e ho trovato:Cambia icone in ActionBar dinamicamente

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

Quindi, in questo modo ho rimuovere il pulsante di pausa e posso aggiungere troppo, ma accadere solo quando avvio il Activity e la ActionBar è disegnato. Come posso forzare a ridisegnare il ActionBar? Inoltre, in questo modo l'intero ActionBar viene ridisegnato. È giusto? C'è un modo per ridisegnare solo il pulsante/l'icona che voglio?

Grazie :)

+7

http://developer.android.com/guide/topics/ui/menus.html - Questo collegamento ha in realtà una sezione "modifica delle voci di menu in fase di esecuzione"! – trumpetlicks

+1

Grazie, ha funzionato perfettamente e sembra il modo giusto di farlo :) – Andres

risposta

44

Dovrete salvare fuori un riferimento al MenuItem dopo aver fatto l'inflazione. Quindi qualcosa di simile al seguente:

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

Quindi è possibile fare riferimento al menu di riproduzione in qualsiasi momento. In questo modo puoi modificare l'elemento come se il tuo giocatore finisse di giocare e dovrebbe tornare a un'icona di gioco.

+1

Grazie, ma lo faccio funzionare con il collegamento degli sviluppatori Android :) – Andres

+0

Che cos'è playService? –

+0

@NeonWarge È il suo codice. Ignoralo. Devi solo concentrarti su '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

sovrascrivere il onPrepareOptionsMenu nella classe di attività e quindi è possibile aggiungere/rimuovere o voci di menu visibile/invisibile.

15

Invece di rimuoverli, è sufficiente nascondere il pulsante che non si desidera visualizzare.

Ad esempio:

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, questo:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    this.invalidateOptionsMenu(); 
} 

è necessario per aggiornare la barra delle azioni. Dopo i dispositivi 3.0, la barra delle azioni non si aggiorna automaticamente. Pertanto, devi dirlo manualmente per chiamare "OnPrepareOptionsMenu (Menu)" in modo che aggiorni gli elementi chiamando "Activity.invalidateOptionsMenu()".

Spero che questo aiuti!

Riferimento: 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

Se si desidera ottenere la prima voce dal menu, **

use menu.getItem(0);

wok questo codice perfettamente:

@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; 
} 
Problemi correlati