我为消息创建了一个操作栏项,当收到新消息时,应该更新它。问题是,当我刷新活动时,它有时会将图标显示为新消息,有时它显示为没有新消息。它是随机发生的。它没有正确更新。我查看了How to update a menu item shown in the ActionBar?
但无法解决我的问题。我意识到问题是onCreateOptionMenu在oncreate时执行。我怎么能推迟呢?
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.loggedmenu, menu);
int no;
try {
no = Integer.parseInt(noOfmsgs);
} catch (NumberFormatException e) {
no = 0;
}
if (no > 0) {
menu.findItem(R.id.messages)
.setIcon(R.drawable.ic_action_new_email);
} else {
menu.findItem(R.id.messages).setIcon(R.drawable.ic_action_email);
}
return true;
}
答案 0 :(得分:1)
正如您所说,onCreateOptionsMenu
在Activity
被创建后被调用,而且至少是您调用invalidateOptionsMenu()
来再次获得此方法。但是,您可以在活动中使用全局变量来更新项目,如下所示:
// global var menu
private Menu mMenu;
// onCreate, onResume, etc.
// Init the var
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.mMenu = menu;
getMenuInflater().inflate(R.menu.loggedmenu, menu);
return true;
}
然后,在执行AsyncTask
,Thread
或您执行的更新noOfmsgs
值后,请调用此方法:
// update the items
private void updateMenuItems() {
int no;
try {
no = Integer.parseInt(noOfmsgs);
} catch (NumberFormatException e) {
no = 0;
}
if (no > 0) {
mMenu.findItem(R.id.messages).setIcon(R.drawable.ic_action_new_email);
} else {
mMenu.findItem(R.id.messages).setIcon(R.drawable.ic_action_email);
}
}