android - 当 onPrepareOptionsMenu 切换菜单项时如何刷新 ActionBar?

标签 android menu android-actionbar

在我的应用程序中,我经常启用/禁用菜单条目,并让它们在 onPrepareOptionsMenu 中可见。

今天我开始在我的一些 Android 2.x 应用程序中添加 android:showAsAction 菜单属性,以在 ActionBar 上显示最常用的菜单条目。

ActionBar 不会立即反射(reflect)启用/禁用和可见性。我需要点击右侧的下拉菜单才能看到这种变化。

好的,我知道菜单会触发 onPrepareOptionsMenu。但是我需要做什么来刷新 ActionBar?我认为需要从 onOptionsItemSelected 中应用此更改,但我不知道应该调用什么。

这是菜单:

<item
    android:icon="@drawable/ic_menu_mapmode"
    android:id="@+id/men_mapview"
    android:showAsAction="ifRoom|withText"
    android:title="@string/txt_mapview" />

<item
    android:icon="@drawable/ic_menu_mapmode"
    android:id="@+id/men_satelliteview"
    android:showAsAction="ifRoom|withText"
    android:title="@string/txt_satelliteview" />

这是 onPrepareOptionsMenu:

@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
    MenuItem menuItemMapView = menu.findItem(R.id.men_mapview);
    MenuItem menuItemSatelliteView = menu.findItem(R.id.men_satelliteview);

    if (mapView.isSatellite()) {
        menuItemMapView.setEnabled(true).setVisible(true);
        menuItemmenuItemSatelliteView.setEnabled(false).setVisible(false);
    } else {
        menuItemMapView.setEnabled(false).setVisible(false);
        menuItemmenuItemSatelliteView.setEnabled(true).setVisible(true);
    }

    return super.onPrepareOptionsMenu(menu);
}

这是 onOptionsItemSelected

@Override
public boolean onOptionsItemSelected(final MenuItem menuItem) {
    switch (menuItem.getItemId()) {
        case R.id.men_mapview:
            mapView.setSatellite(false);
            mapView.setStreetView(true);
            mapView.invalidate();

            invalidateOptionsMenu(); // This works on Android 3.x devices only
            return true;
        case R.id.men_satelliteview:
            mapView.setSatellite(true);
            mapView.setStreetView(false);
            mapView.invalidate();

            invalidateOptionsMenu(); // This works on Android 3.x devices only
            return true;
    }

    return super.onOptionsItemSelected(menuItem);
}

编辑:如果我添加 invalidateOptionsMenu 这适用于 Android 3.x 应用程序,但由于缺少方法而在 Android 2.x 设备上崩溃。推荐的正确方法是什么?

最佳答案

我选择的方法是创建一个辅助类。例如:

class VersionHelper
{
    static void refreshActionBarMenu(Activity activity)
    {
        activity.invalidateOptionsMenu();
    }
}

现在在上面的代码中,将 invalidateOptionsMenu(); 替换为:

if (Build.VERSION.SDK_INT >= 11)
{
    VersionHelper.refreshActionBarMenu(this);
}

此方法归功于 CommonsWare(搜索 HoneycombHelper,并查看他的书籍 - 强烈推荐)

关于android - 当 onPrepareOptionsMenu 切换菜单项时如何刷新 ActionBar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7765184/

相关文章:

java - 模拟点击SWT中的菜单项

Android - ResourcesNotFoundException 试图通过资源 id 设置操作栏图标时

安卓 : Change entire app layout directions programmatically

Android 下拉菜单(无微调器!)

java - 如何使用列表在我的布局中的工具栏中放置一个按钮?

android - 如何改变RayMenu的方向

JQuery 菜单打开但随后消失

android - 如何在不更改标准操作栏的情况下更改上下文操作栏的溢出图标?

javascript - 无法将没有 YogaNode 的子节点添加到没有测量功能的父节点

android - imageview 未设置全屏