2017-09-30 26 views
1

我都尝试onCreateOptionsMenu(菜单菜单)onPrepareOptionsMenu(菜单菜单)方法,但是当应用程序在后台打开我不能改变图标visibility.As更改菜单图标我想我需要在内调用这些方法onResume()当应用程序来自于背景(在的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; 
} 
+0

使用'invalidateoptionsmenu()'如果你正在改变这些挂钩外的菜单采取行动 – nomag

+1

,您可能需要调用'invalidateOptionsMenu()'。你试过了吗? – Jon

+1

我认为[此链接](https://developer.android.com/guide/topics/ui/menus.html#ChangingTheMenu)会帮助你。 –

回答

1

,如果你需要动态地修改你的菜单项目按照这个过程:

  1. 获取到你的菜单项的引用您创建菜单
  2. 改变这些项目在你的生命周期中的状态后,方法
  3. 无效菜单

实施例:

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

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

它指引我到最后的解决方案。这是我如何以100%的准确度解决问题。

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

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

如果要根据活动生命周期中发生的事件修改选项菜单,可以在onPrepareOptionsMenu()方法中执行此操作。该方法将当前存在的Menu对象传递给您,以便您可以对其进行修改,例如添加,删除或禁用项目。 (片段也提供了一个onPrepareOptionsMenu()回调。)--Official Android Documentation--

我们需要调用invalidateOptionsMenu()的onResume()用于refreash塔图方法中,当应用程序来自于背景。

@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; 
    } 
相关问题