2012-06-13 87 views
49

我有一個Activity它有一個ActionBar,但我需要改變對ActionBar圖標動態,我有一個暫停播放按鈕,我需要更換播放按鈕隨着用戶點擊它,暫停按鈕。我已經搜查,我發現:更改圖標動態

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

所以這樣我刪除暫停按鈕,我也可以加,但是當我開始ActivityActionBar繪製它纔會發生。我如何強制重畫ActionBar?此外,整個ActionBar重新繪製。是對的嗎?有什麼辦法只重繪我想要的按鈕/圖標?

謝謝:)

+7

http://developer.android.com/guide/topics/ui/menus.html - 此鏈接實際上有一個「運行時更改菜單項」部分! – trumpetlicks

+1

謝謝它工作完美,它似乎是正確的方式:) – Andres

回答

44

你必須做的通貨膨脹後保存關閉的菜單項的引用。因此,如下所示:

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

然後您可以隨時參考playMenu。所以你可以修改這個項目,說你的播放器完成播放,應該回到播放圖標。

+1

謝謝,但我得到它的工作惠特Android開發者的鏈接:) – Andres

+0

什麼是playService? –

+0

@NeonWarge這是他自己的代碼。只要忽略它。你只需要關注'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

覆蓋在你的活動類的onPrepareOptionsMenu,然後你可以添加/刪除或可見/不可見的菜單項。

15

而不是刪除它們,你可以隱藏你不想顯示的按鈕。

例如:

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

剛一說明,這樣的:

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

需要更新的操作欄。 3.0設備之後,操作欄不會自動更新。因此,您必須手動指示它調用「OnPrepareOptionsMenu(Menu)」,以便通過調用「Activity.invalidateOptionsMenu()」來刷新項目。

希望這會有所幫助!

參考: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

如果你想從你的菜單中獲得的第一個項目,**

use menu.getItem(0);

今典炒鍋完美:

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