首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当onPrepareOptionsMenu切换菜单项时,如何刷新ActionBar?

当onPrepareOptionsMenu切换菜单项时,如何刷新ActionBar?
EN

Stack Overflow用户
提问于 2011-10-14 16:49:46
回答 9查看 80K关注 0票数 63

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

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

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

好的,我知道菜单会触发onPrepareOptionsMenu。但是我需要做些什么来刷新ActionBar呢?我认为这个更改需要在onOptionsItemSelected中应用,但我不知道该如何命名。

这是菜单:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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,它可以在Android3.x应用程序上运行,但在Android2.x设备上会因为缺少方法而崩溃。推荐的正确方法是什么?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-10-19 06:43:17

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

代码语言:javascript
复制
class VersionHelper
{
    static void refreshActionBarMenu(Activity activity)
    {
        activity.invalidateOptionsMenu();
    }
}

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

代码语言:javascript
复制
if (Build.VERSION.SDK_INT >= 11)
{
    VersionHelper.refreshActionBarMenu(this);
}

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

票数 88
EN

Stack Overflow用户

发布于 2013-10-29 12:48:54

多亏了公认的答案。我正在使用ActionBarActivity。在这个类中,您可以使用

代码语言:javascript
复制
supportInvalidateOptionsMenu();
票数 68
EN

Stack Overflow用户

发布于 2013-10-17 18:14:22

使用

代码语言:javascript
复制
ActivityCompat.invalidateOptionsMenu(Activity activity)

来自compatibility library的。

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7765184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档