以编程方式更改选项菜单/操作栏菜单3.0+

时间:2012-10-11 13:41:52

标签: android menu option

简而言之,这是我的问题:

可以在Android 3.0 +上以编程方式修改选项菜单(显示在操作栏中)吗?

我有一个向导式活动,我在其中使用ViewFlipper在视图或步骤之间切换。

步骤是:1(无) - > 2(菜单) - > 3(没什么)。

只有第二个屏幕(2)有一个菜单项,而其他屏幕没有,所以我需要在显示活动时隐藏/删除菜单,然后在操作后显示/添加。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.mMenu = menu;

    getMenuInflater().inflate(R.menu.my_menu, menu);
    mMenu.getItem(0).setVisible(false);

    return super.onCreateOptionsMenu(menu);
}

切换到第二个屏幕 - >

public void showNext(View v) {
    if (mVFlipper.getDisplayedChild() < (mVFlipper.getChildCount() - 1)) {
        mVFlipper.showNext();
        if (mVFlipper.getDisplayedChild() == 1) {
            setTitle("Second screen");
            mMenu.getItem(0).setVisible(true);
        }
    }
}

这在2.2上运行良好,但在4.1上失败了。从可见的MenuItem开始,隐藏它并在以后显示它。从隐藏的菜单项开始并稍后显示它不起作用。

我的主要问题似乎是在onCreateOptionsMenu完成执行后,MenuItem是不可见的。我可以让MenuItem保持对这个方法可见,但我没有其他可用的回调来隐藏它。

3 个答案:

答案 0 :(得分:4)

Android的MenuItem setVisible中存在一个错误,在将项目恢复为可见时会导致问题。

在你的onCreateOptionsMenu()中,添加一个检查以查看显示的页面是否需要菜单,如果是,则添加MenuItem。然后,每当页面更改时调用invalidateOptionsMenu()。这将重建菜单。

答案 1 :(得分:1)

通过在onCreateOptionsMenu完成后将MenuItem显示然后将其隐藏在onCreateOptionsMenu之后调用的回调中来解决问题:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.mMenu = menu;

    getMenuInflater().inflate(R.menu.my_menu, menu);        

    boolean dummyVal = super.onCreateOptionsMenu(menu);

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
        mMenu.getItem(0).setVisible(true);  
    } else {
        mMenu.getItem(0).setVisible(false);
    }

    return dummyVal;
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        if (mMenu != null) {
            mMenu.getItem(0).setVisible(false);
        }
    }
}

如果有人遇到此问题,我建议先尝试toadzky的建议:调用“invalidateOptionsMenu()”。

答案 2 :(得分:1)

我也在努力解决这个问题,然后我应用了一个小黑客:

menu1.setEnabled(false);
menu1.setTitle("");

然后你想再次看到它的地方:

menu1.setEnabled(true);
menu1.setTitle("Okay"); //or you can set text according to your given updated values.