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

2023-12-26

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

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

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

好的,我确实知道菜单会在PrepareOptionsMenu 上触发。但是我需要做什么来刷新 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);
}

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


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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

onPrepareOptionsMenu 切换菜单项时如何刷新 ActionBar? 的相关文章

随机推荐

  • Java 中箭头运算符“->”有什么作用?

    在搜索一些代码时 我遇到了箭头运算符 它到底是做什么的 我以为Java没有箭头运算符 return Collection
  • Entity Framework 5 的新迁移功能是否完全支持枚举更改?

    假设我们有以下简单模型 public class Car public int Year get set public string Make get set public string Model get set public CarTy
  • 如何编辑 jquery 函数

    我正在尝试修改 jQuery V 6 1 核心中的 attr 函数 我有一个plugins js 文件 该文件包含在jquery 6 1 js 文件之后的页面中 plugins js 文件包含对各种 jQuery 核心函数的改进 以适应某些
  • Scrapy获取任何网站的所有链接

    我有以下 Python 3 网络爬虫代码 import requests from bs4 import BeautifulSoup import re def get links link return links r requests
  • C++ 使用构造函数参数初始化成员数组

    我有一个模板类 其中包含编译时常量长度的单个成员数组 我希望这个数组是常量 但根据构造函数提供的输入初始化它被证明很困难 struct Input int value template
  • 正则表达式:理解音节计数器代码

    我用过迪伦的问题 https stackoverflow com questions 5686483 how to compute number of syllables in a word in javascript这里关于 JavaSc
  • 加入位于不同 Docker 容器中的 serf 节点时出现问题

    上下文 主机是 AWS EC2 Ubuntu 14 04 5 带有 Docker 版本 17 05 0 ce 容器是根据公开可用的存储库映像构建的cbhihe serf alpine bash 所有容器都位于同一个 EC2 实例上 并与网络
  • 如何知道两个单词是否具有相同的词根?

    我想知道 在几种语言中 两个词是否是 要么同一个词 或同一个词的语法变体 例如 had and has具有相同的基础 在这两种情况下 它都是动词have city and cities具有相同的基数 went and gone具有相同的基数
  • Xcode 4 idekeybounds 一次击键可绑定多个命令

    拼命尝试自定义 Xcode 4 键绑定 我正在编辑用户 idekeybindings 文件 当打开时修改该文件 然后随后尝试通过键绑定界面进行更新时 xcode 有时会擦除该文件 可爱 我的理解是 提供一个命令 选择器 而不是仅仅一个字符串
  • bash:nano:在 Windows git bash 中找不到命令

    我在 Windows 电脑上使用 git 版本 2 7 0 windows 1 我使用了以下命令 nano README 结果我 bash nano command not found 现在如何将 Nano 文本编辑器安装到 git bas
  • 理解 main 的一个不常见的参数

    以下问题是在大学编程竞赛中给出的 我们被要求猜测输出和 或解释其工作原理 不用说 我们都没有成功 main write read 0 1 main 一些简短的谷歌搜索让我找到了这个确切的问题 在codegolf stackexchange
  • 正则表达式的含义如 - \\d , \\D, ^ , $ 等 [重复]

    这个问题在这里已经有答案了 这些表达的意思是什么 我在哪里可以了解它们的用法 d D s S w W t n etc 我需要使用stringr包 我完全不知道如何使用这些 From regexp 在里面扩展正则表达式部分 插入符号 和美元符
  • 子查询上的 Groupwise MAX()

    我正在尝试计算返回表中的最大值以及该表中的其他值 然而 我正在执行此操作的表不是 真正的 表 它是由子查询生成的表 这给我带来了问题 因为我认为在不重新指定整个子查询的情况下我无法连接它两次 我目前有一个 SQL Server 解决方案 使
  • React中继injectNetworkLayer不是一个函数

    我正在遵循 lynda 的教程 构建和部署全栈 React 应用程序 在 注入中继网络层 一章中 在index js中 尝试设置网络层 程序编译成功 但我在浏览器中收到以下错误 类型错误 WEBPACK IMPORTED MODULE 4
  • com.google.cloud.pubsub.spi.v1.Publisher.publish 未将数据发送到 PubSub

    对新版本的调用com google cloud pubsub spi v1 Publisher publish pubsubMessage get 永远挂着 我不确定问题是什么 代码片段 com google cloud pubsub sp
  • Dialogflow,从音频中检测意图

    我正在尝试将音频文件发送到对话流 API 进行意图检测 我已经有一个工作得很好的代理 但只能处理文本 我正在尝试添加音频功能 但没有成功 我正在使用此页面中提供的示例 Java https cloud google com dialogfl
  • Visual Studio 2017 中的 SSIS 工具箱缺少某些组件

    我在用Visual Studio Community 2017用于开发 SSIS 包 我使用 SQL Server 2016 某些组件不在 SSIS 工具箱中 这就是我现在拥有的 这是我的大学所拥有的 他们没有与我相同版本的 Visual
  • 如何在 Excel 中使用 VBA 从 SQLite 数据库检索数据?

    我正在使用 ADO 从 VBA 连接到 db 文件 遵循此问题的答案question https stackoverflow com questions 42509154 accessing a sqlite database in vba
  • 无法更改 Visual Studio 代码设置

    我尝试更改 Visual Studio 代码设置 但无法编辑任何内容 我应该怎么办 我想将编码设置为 files encoding ISO 8859 1 这些是我使用的步骤 1 Ctrl Shift p 打开命令面板2 搜索设置并单击首选项
  • onPrepareOptionsMenu 切换菜单项时如何刷新 ActionBar?

    在我的应用程序中 我经常启用 禁用菜单条目 并让它们从 onPrepareOptionsMenu 中可见 今天 我开始向我的一些 Android 2 x 应用程序添加 android showAsAction 菜单属性 以显示 Action