我尝试了 onCreateOptionsMenu(菜单菜单)和 onPrepareOptionsMenu(菜单菜单)方法但是当应用程序在后台打开时我无法更改图标可见性。我认为我需要在 onResume()
中调用这些方法当app第一次启动它按预期工作。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it present.
getMenuInflater().inflate(R.menu.example_menu, menu);
// show manu items if not ofline mode
if (Utils.checkNetworkStatus(ExampleActivity.this)) {
menu.findItem(R.id.edit).setVisible(true);
menu.findItem(R.id.delete).setVisible(true);
}else {
menu.findItem(R.id.edit).setVisible(false);
menu.findItem(R.id.delete).setVisible(false);
}
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu){
if (Utils.checkNetworkStatus(ExampleActivity.this)) {
menu.findItem(R.id.edit).setVisible(true);
menu.findItem(R.id.delete).setVisible(true);
}else {
menu.findItem(R.id.edit).setVisible(false);
menu.findItem(R.id.delete).setVisible(false);
}
return true;
}
答案 0 :(得分:3)
感谢@jon和@Oliver Adam的回答。
它指导我到最终的解决方案。这就是我如何以100%的准确度解决问题。
根据文档,如果我们需要在运行时更改菜单项,建议使用 onPrepareOptionsMenu(菜单菜单)方法,而不是使用 onCreateOptionsMenu(菜单菜单)强>
系统调用onCreateOptionsMenu()后,它会保留您填充的菜单实例,并且不会再次调用onCreateOptionsMenu(),除非由于某种原因菜单失效。但是,您应该仅使用onCreateOptionsMenu()来创建初始菜单状态,而不是在活动生命周期中进行更改。
如果要根据活动生命周期中发生的事件修改选项菜单,可以在onPrepareOptionsMenu()方法中执行此操作。此方法会将Menu对象传递给当前存在,以便您可以对其进行修改,例如添加,删除或禁用项目。 (片段还提供onPrepareOptionsMenu()回调。)--Official Android Documentation--
我们需要在 onResume()方法中调用 invalidateOptionsMenu(),以便在应用来自后台时重新显示视图。
@Override
protected void onResume() {
super.onResume();
invalidateOptionsMenu();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu){
if (Utils.checkNetworkStatus(ExampleActivity.this)) {
menu.findItem(R.id.edit).setVisible(true);
menu.findItem(R.id.delete).setVisible(true);
}else {
menu.findItem(R.id.edit).setVisible(false);
menu.findItem(R.id.delete).setVisible(false)
}
return true;
}
答案 1 :(得分:2)
如果您需要动态修改菜单项,请按照以下流程操作:
示例:
private MenuItem editMenuItem, deleteMenuItem;
@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, menu);
editMenuItem = menu.findItem(R.id.edit).setVisible(true);
deleteMenuItem = menu.findItem(R.id.delete).setVisible(true);
return true;
}
@Override
protected void onResume() {
super.onResume();
boolean online = Utils.checkNetworkStatus(ExampleActivity.this);
if (editMenuItem != null){
editMenuItem.setVisible(online);
}
if (deleteMenuItem != null){
deleteMenuItem.setVisible(online);
}
invalidateOptionsMenu();
// or supportInvalidateOptionsMenu();
}