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

时间:2017-09-30 16:56:06

标签: java android xml android-menu

我尝试了 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;
} 

2 个答案:

答案 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)

如果您需要动态修改菜单项,请按照以下流程操作:

  1. 创建菜单后获取对菜单项的引用
  2. 更改生命周期方法中这些项目的状态
  3. 使菜单无效
  4. 示例:

    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();
    }