dynamic地更改ActionBar中的图标

我有一个Activity有一个ActionBar但我需要dynamic地更改ActionBar上的图标,我有一个暂停和一个播放button,我需要用暂停buttonreplace播放button,当用户点击它。 我search了,我发现它:

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

所以通过这种方式,我删除了暂停button,我也可以添加它,但只有当我启动Activity并且绘制了ActionBar时才会发生。 我如何强制重新绘制ActionBar ? 而且,这样整个ActionBar被重新绘制。 是对的吗? 有什么办法只重绘我想要的button/图标?

谢谢 :)

在通货膨胀之后,你必须保存对MenuItem的引用。 所以如下所示:

 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。 所以你可以修改该项目,说你的播放器完成播放,应该回到播放图标。

而不是删除它们,你可以隐藏你不想显示的button。

例如:

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

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

如果你想从菜单中获得第一项,**

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

覆盖活动类中的onPrepareOptionsMenu ,然后添加/删除或可见/不可见的菜单项。