如何在onPrepareOptionsMenu切换菜单条目时刷新ActionBar?

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

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

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

好的,我明白菜单会触发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,并检查他的书 - 强烈推荐)


感谢接受的答案。 我正在使用ActionBarActivity。 在这个课堂上你可以使用

supportInvalidateOptionsMenu();

使用

ActivityCompat.invalidateOptionsMenu(Activity activity)

来自兼容性库。

请参阅:https://stackoverflow.com/a/14748687/435855

链接地址: http://www.djcxy.com/p/63907.html

上一篇: How can I refresh the ActionBar when onPrepareOptionsMenu switched menu entries?

下一篇: How to update a menu item shown in the ActionBar?