当应用程序来自后台时更改菜单图标(在 onResume() 方法中)

Cha*_*ndo 3 java xml android android-menu

我尝试了onCreateOptionsMenu(Menu menu)onPrepareOptionsMenu(Menu menu)方法,但是当应用程序在后台打开时,我无法更改图标可见性。因为我认为我需要在onResume()内调用这些方法

当应用程序第一次启动时它会按预期工作。

 @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;
} 
Run Code Online (Sandbox Code Playgroud)

Cha*_*ndo 7

感谢@jon 和@Oliver Adam 的回答。

它引导我找到最终的解决方案。这就是我以 100% 准确率解决问题的方法。

根据文档,如果我们需要在运行时更改菜单项,建议使用onPrepareOptionsMenu(Menu menu)方法,而不是使用onCreateOptionsMenu(Menu menu)

系统调用onCreateOptionsMenu()后,它会保留您填充的Menu的实例,并且不会再次调用onCreateOptionsMenu(),除非菜单由于某种原因失效。但是,您应该仅使用 onCreateOptionsMenu() 创建初始菜单状态,而不是在活动生命周期中进行更改。

如果要根据 Activity 生命周期中发生的事件修改选项菜单,可以在 onPrepareOptionsMenu() 方法中执行此操作。此方法将当前存在的 Menu 对象传递给您,以便您可以对其进行修改,例如添加、删除或禁用项目。(Fragments 还提供了 onPrepareOptionsMenu() 回调。)--Android 官方文档 --

当应用程序来自后台时,我们需要在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;
  }
Run Code Online (Sandbox Code Playgroud)