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)
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
,然后添加/删除或可见/不可见的菜单项。