当 onPrepareOptionsMenu 切换菜单条目时,如何刷新 ActionBar? [英] How can I refresh the ActionBar when onPrepareOptionsMenu switched menu entries?

查看:20
本文介绍了当 onPrepareOptionsMenu 切换菜单条目时,如何刷新 ActionBar?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Within my apps I often enable/disable menu entries and do make them visible from onPrepareOptionsMenu.

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

Today I started to add the android:showAsAction menu attribute to some of my Android 2.x apps to show menu entries used most on the ActionBar.

ActionBar 不会立即反映启用/禁用和可见性.我需要点击右侧的菜单下拉菜单才能看到此更改发生.

The ActionBar does not reflect the enable/disable and visibility immediately. I need to click on the menu dropdown on the right to see this change happen.

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

Ok, I do understand that the menu fires onPrepareOptionsMenu. But what do I need to do to refresh the ActionBar? I think this change needs to be applied from within onOptionsItemSelected but I don't know what I should call.

这是菜单:

<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:

Here's the 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

Here's the 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 设备上崩溃.推荐的正确做法是什么?

If I add invalidateOptionsMenu this works on Android 3.x apps but crashes on Android 2.x devices because of a missing method. What's the recommended way to do it right?

推荐答案

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

My method of choice is to create a helper class. For example:

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

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

Now in your code above, replace invalidateOptionsMenu(); with:

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

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

Credit for this method goes to CommonsWare (search for HoneycombHelper, and check out his books - highly recommended)

这篇关于当 onPrepareOptionsMenu 切换菜单条目时,如何刷新 ActionBar?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆