我的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;
}
因此,通过这种方式,我删除了暂停按钮,我也可以添加它,但只有在我启动Activity
并且绘制ActionBar
时才会添加它。如何强制重绘ActionBar
?此外,通过这种方式,重新绘制了整个ActionBar
。是对的吗?有没有办法只重绘我想要的按钮/图标?
谢谢:)
答案 0 :(得分:49)
在进行充气后,您必须保存对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。因此,您可以修改项目,如播放器完成播放,并应返回播放图标。
答案 1 :(得分:19)
您可以隐藏不想显示的按钮,而不是删除它们。
例如:
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()”来刷新项目。
希望这有帮助!
答案 2 :(得分: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);
}
}
}
答案 3 :(得分:2)
覆盖活动类中的onPrepareOptionsMenu
,然后您可以添加/删除或显示/隐藏菜单项。
答案 4 :(得分:2)
如果您想从菜单中获取第一项,**
auth('api')->user()
本准则完美无缺:
use menu.getItem(0);
答案 5 :(得分:1)
使用invalidateOptionsMenu()方法。
EOMONTH