我有一个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
都会被重新绘制。是那么回事吗?有没有办法只重画我想要的按钮/图标?
谢谢您:)
发布于 2012-06-13 08:55:39
在做完膨胀之后,你必须省去对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。所以你可以修改项目,比如你的玩家玩完了,应该回到一个播放图标。
发布于 2015-07-02 00:43: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()”来刷新项目。
希望这能有所帮助!
发布于 2015-02-12 21:33:53
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);
}
}
}
https://stackoverflow.com/questions/11006749
复制相似问题