2012-06-13 18 views
49

Ich habe eine Activity, die eine ActionBar hat, aber ich muss auf der ActionBar dynamisch die Symbole ändern, ich habe eine Pause und Spiel Taste und ich brauche die Spiel Taste ersetzen mit der Pause Schaltfläche als der Benutzer klicken Sie darauf. Ich habe gesucht und ich fand es:ändern Symbole in ActionBar dynamisch

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

So auf diese Weise entferne ich die Pause Taste und ich kann es auch hinzufügen, aber es geschieht nur, wenn ich die Activity und die ActionBar gezogen starten. Wie kann ich erzwingen, die ActionBar neu zu zeichnen? Auch auf diesem Weg wird das ganze ActionBar neu gezeichnet. Ist das richtig? Kann ich nur die gewünschte Schaltfläche/das Symbol neu zeichnen?

Danke :)

+7

http://developer.android.com/guide/topics/ui/menus.html - Dieser Link hat tatsächlich einen Abschnitt "Ändern der Menüoptionen zur Laufzeit"! – trumpetlicks

+1

Danke es funktionierte perfekt, und es scheint der richtige Weg, es zu tun :) – Andres

Antwort

44

Sie werden die Inflation nach dem Handeln einen Verweis auf das MenuItem speichern off müssen. So etwas wie das Folgende:

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

Dann können Sie jederzeit auf das PlayMenu verweisen. So können Sie den Gegenstand ändern, indem Sie sagen, dass Ihr Spieler das Spiel beendet hat und zu einem Spielsymbol zurückkehren sollte.

+1

Danke, aber ich bekomme es die Verbindung von Android-Entwickler Whit Arbeits :) – Andres

+0

Was ist playService? –

+0

@NeonWarge Es ist sein eigener Code. Ignoriere es einfach. Sie müssen sich nur auf 'playMenu' konzentrieren. – 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

die onPrepareOptionsMenu in Ihrer Aktivitätsklasse außer Kraft setzen und dann kann man hinzufügen/entfernen oder sichtbar/unsichtbar Menüpunkte.

15

Anstatt sie zu entfernen, können Sie einfach die Schaltfläche ausblenden, die nicht angezeigt werden soll.

Zum Beispiel:

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

Nur eine Notiz, diese:

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

erforderlich, um die Aktionsleiste zu aktualisieren. Nach 3,0 Geräten aktualisiert sich die Aktionsleiste nicht automatisch. Sie müssen es also manuell anweisen, das "OnPrepareOptionsMenu (Menu)" aufzurufen, damit die Elemente aktualisiert werden, indem "Activity.invalidateOptionsMenu()" aufgerufen wird.

Hoffe, das hilft!

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

Wenn Sie das erste Element aus dem Menü erhalten möchten, **

use menu.getItem(0);

dieser Kodex freigegegeben:

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