0

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

可以在 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 保持可见,但我没有其他可用的回调来隐藏它。

4

3 回答 3

4

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

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

于 2012-10-11T14:27:52.730 回答
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()”。

于 2012-10-11T14:19:09.750 回答
1

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

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

然后你想再次看到它:

menu1.setEnabled(true);
menu1.setTitle("Okay"); //or you can set text according to your given updated values.
于 2014-01-31T09:16:56.247 回答