单击有时位于溢出菜单中的菜单项

2024-02-11

目前,要单击有时在某些设备上的溢出菜单中的菜单项,我正在执行以下操作:

fun invokeMenu(@IdRes menuId: Int, @StringRes menuStringRes: Int) {
 try {
  onView(withId(menuId)).perform(click())
 } catch (nmv: NoMatchingViewException) {
  openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getInstrumentation().targetContext)
  onView(withText(menuStringRes)).perform(click())
 }
}

但我正在寻找一种更好的方法 - 理想情况下我只需要知道菜单 ID 即可。您如何在浓缩咖啡测试中做到这一点?


不幸的是,你的理想情况无法实现。这是由于支持库的构建。

让我们从PopupMenu https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/widget/PopupMenu.java#48,其中引用了MenuPopupHelper https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/view/menu/MenuPopupHelper.java#58,其中参考了MenuPopup https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/view/menu/MenuPopup.java。这是一个扩展的抽象类。经过StandardMenuPopup https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/view/menu/StandardMenuPopup.java。它有参考MenuAdapter https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/view/menu/MenuAdapter.java#92。如果你查看第 92 行MenuAdapter你会看到这一行:

itemView.initialize(getItem(position), 0);

这是关键的方法调用。它可以被调用ActionMenuItemView https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java or ListMenuItemView https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/view/menu/ListMenuItemView.java。他们的实现有所不同,即id 附加到 ActionMenuItemView https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java#132, and 未附加到 ListMenuItemView https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/view/menu/ListMenuItemView.java#102

而且,MenuAdapter.getItemId(int position) https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/view/menu/MenuAdapter.java#80仅返回position。菜单项的 id 在溢出菜单中丢失。


但是,您的代码可以简化为一行。定义一个函数:

public static Matcher<View> withMenuIdOrText(@IdRes int id, @StringRes int menuText) {
    Matcher<View> matcher = withId(id);
    try {
        onView(matcher).check(matches(isDisplayed()));
        return matcher;
    } catch (Exception NoMatchingViewException) {
        openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getInstrumentation().getTargetContext());
        return withText(menuText);
    }
}

Usage:

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

单击有时位于溢出菜单中的菜单项 的相关文章

  • 如何做Android - 滑动抽屉从左到右滑动..?

    如何将android滑动抽屉从LTR滑动 使用时android orientation horizontal 它从 RTL 滑出 我该如何进行 LTR 谢谢 我找到了答案表格 Here http blog sephiroth it 2011
  • 在 Android 上通话结束时启动活动

    我想在通话结束时启动一项活动 找不到任何对此的参考 我该怎么做 我还没有尝试过这个 但我假设你可以运行一些服务 始终在后台运行 它利用电话状态监听器 http developer android com reference android
  • 设置文本视图 Android 的文本颜色

    在 string xml 文件中我使用以下标签
  • gradle更新后无法找到方法(无法编译项目)

    我尝试将项目中的 gradle 版本更新为 4 1 milestone 1 以下这些说明 https developer android com studio build gradle plugin 3 0 0 migration html
  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 插件“Android Bundle Support”不兼容

    大家好 自从上次更新以来 当我启动 android studio 时 我遇到了一个非常奇怪的错误 我有这个错误 插件错误 插件 Android Bundle Support 不兼容 直到构建 AI 195 SNAPSHOT 我在网上找不到任
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • 如何将 CSV 加载到 IPython 笔记本中

    我有一个 csv 文件准备加载到我的 python 代码中 但是 我想将其加载为以下格式 data A B C D A B C D A B C D 我将如何加载可作为 numpy 数组读取的 csv 文件 例如 仅仅使用以前的教程就会对使用
  • Rails 模型中的虚拟属性

    在我的控制器中 我在 for 循环中调用 hour shopper add product 我的模型看起来像 class Shopper lt ActiveRecord Base attr accessor quantity def add
  • 返回一个 Disposable 对象以在 using 块中使用

    如何在函数中返回一次性对象以确保它在函数内正常工作using堵塞 在我的函数中 我想对一次性对象进行操作并解释错误 这使事情变得复杂 到目前为止 我有类似于以下代码的内容 DBHandle GetDB I can t do this bec
  • 以编程方式单击按钮 - JS

    我在其他网络应用程序中看到过这样做 但我对 Javascript 还很陌生 无法自己真正弄清楚这一点 我想以编程方式创建一个 Google Hangout 但是 在官方 API 中 创建环聊的唯一方法是在页面上添加环聊按钮 这是有关环聊按钮
  • 使用 MockEndPointsandSkip 进行 Camel 单元测试

    我是 Camel 新手 正在尝试一些代码来了解 MockEndpoints 功能的工作原理 但它不起作用 以下是我想使用 MockEndpoints 进行单元测试的 Camel 路线 属性值在 application properties
  • 根据下拉选择更改表单操作

    需要表单根据特定下拉菜单中的选择来更改其操作 更改时应触发脚本并在用户提交之前更改操作 当您刚接触 JS 时 说起来容易做起来难 感谢您的帮助 Javascript
  • 创建仅打印到一行的 XML

    我创建了一些将映射写入 XML 的代码 它似乎可以工作 但打印的文件没有新行 所以在任何 XML 编辑器中它都只占一行 如何让它为每个孩子打印到新行 DocumentBuilderFactory dbf DocumentBuilderFac
  • Make:对 docker 镜像的依赖

    我正在使用 docker 工作流程根据给定的规范文件生成一些文件 其中 Makefile 为 它根据 OpenAPI 规范生成客户端 SWAGGER PWD swagger yaml GENERATOR openapitools opena
  • 如何从头开始对包使用 org.apache.felix.scr 注释?

    我已经开始为 apache felix 开发一个包 并使用 ops4j pax 插件来完成 我已经创建了项目结构pax create project在那里做了正常的pax create bundle 然后你就得到了用 Maven 构建整个项
  • 无法调试 Objective-C 应用程序中嵌入的 Swift 模块/框架

    替代标题 以帮助搜索 无法调试链接到 Xcode 8 中的 Objective C 应用程序的 Swift 2 3 框架 error in auto import failed to get module XYZ from AST cont
  • 我可以在 Python 中从后台线程渲染 openCV 动画吗?

    我可以在 Python 中从后台线程渲染 openCV 动画吗 这是我的尝试 import cv2 import numpy as np from time import sleep bitmap np zeros 512 512 3 np
  • 使用 JsonConverter 进行 OnDeserialized 回调

    我正在尝试使用JsonConverter from 这个答案 https stackoverflow com a 33094930 2120779 to 我可以在属性中指定路径以将类中的属性映射到 JSON 中的子属性吗 https sta
  • 如何强制象限的每个部分仅占据其四分之一的区域(HTML/CSS)?

    我需要创建一个 仪表板 模型 显示四个等大小的正方形 以下关键 html 和 css 是我尝试实现此目的所使用的
  • 如何在编辑文本聚焦时显示软键盘

    我想在按下键盘时自动显示软键盘EditText焦点集中 如果设备没有物理键盘 并且我有两个问题 When my Activity显示 我的EditText获得焦点但键盘不显示 我需要再次单击它才能显示键盘 当我的Activity被展示 当我
  • 将 keyAdapter 替换为按键绑定

    由于键适配器无法正常工作 我如何在此代码中使用键绑定 我已经查看了键绑定的文档 但我不明白如何执行此操作 private class KeyLis extends KeyAdapter Override public void keyPre
  • 如何在 gcloud python 实例中按网络IP进行过滤

    我正在使用 gcloud python 客户端库 https github com google google api python client https github com google google api python clie
  • 我可以 LINQ JSON 吗?

    这是我从 NET 上的请求中获取的 JSON id 110355660738 picture data url https fbcdn profile a akamaihd net hprofile ak prn2 1027085 1203
  • 没有路由匹配 service-worker.js

    我生成了 Rails 应用程序 并立即收到此消息 我不知道 service worker js 是什么 但我认为它可以与一些默认的 gem 捆绑在一起 Started GET service worker js for 127 0 0 1
  • Stream.spliterator 对于并行流的奇怪行为

    我直接使用流分割器来执行我正在编写的库中的低级操作 最近 当我使用流分割器和交错时 我发现了非常奇怪的行为tryAdvance trySplit来电 这是演示该问题的简单代码 import java util Arrays import j
  • 单击有时位于溢出菜单中的菜单项

    目前 要单击有时在某些设备上的溢出菜单中的菜单项 我正在执行以下操作 fun invokeMenu IdRes menuId Int StringRes menuStringRes Int try onView withId menuId