Android菜单项可见性在运行时更改

时间:2017-12-12 02:10:01

标签: android exception android-actionbar android-menu

我正在尝试在正在运行activity的后台执行任务时隐藏操作栏菜单项一段时间。

首先在活动的onPrepareOptionsMenu方法中,我将MenuItem实例检索为字段。

public void onPrepareOptionsMenu(final Menu menu) {
    super.onPrepareOptionsMenu(menu);
    // Retrieve and show the contextual settings menu item
    mContextualSettings = menu.findItem(R.id.item_menu_contextual_settings);
    mContextualSettings.setVisible(true);
}

稍后我使用该字段使其不可见并再次可见(通过使用setVisible方法)。

我想知道这是一个好方法,还是我应该以某种方式使用invalidateOptionsMenu()让它再次可见?我可以遇到空指针异常吗?

感谢。

3 个答案:

答案 0 :(得分:1)

  

我将MenuItem实例检索为字段。 [...]我想知道这是一个好方法还是我应该以某种方式使用invalidateOptionsMenu()使其再次可见?

这不是推荐的方式来做你正在尝试的事情。您最好使用supportInvalidateOptionsMenu()触发onPrepareOptionsMenu()boolean字段或方法进行检查,然后直接设置项目的可见性。

  

我可以遇到空指针异常吗?

在Android的最新版本中,onPrepareOptionsMenu()可能会在Menu通过onCreateOptionsMenu()充气之前被调用。因此,您应始终对menu.findItem()的结果执行空检查,或以其他方式防止此情况(可能通过检查是否menu.getSize() > 0)。

答案 1 :(得分:0)

        // instance variable
        public Menu option_Menu

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_container, menu);
    option_Menu = menu;
    option_Menu.findItem(R.id.skip).setVisible(false);      
    return super.onCreateOptionsMenu(menu);
    }

    // when task is completed you can show your menu just by calling this method
    public void setMenuVisible(boolean visible, int id) {
    if (option_Menu != null) {
    option_Menu.findItem(id).setVisible(visible);
    }
}

答案 2 :(得分:0)

使用这种方式

MenuItem menuItem = menu.findItem(R.id.menu_done);      
menuItem.setVisible(true); //visible
menuItem.setVisible(false); //gone
return true;`