我认为以下来自中等文章的解释非常好理解touch mode
。ActivityTestRule
“在触摸模式下,没有焦点,也没有选择。”
换句话说,当您的手指触摸屏幕时,它不会产生副作用。例如,视图不会保持焦点。除非您回想起 Android 操作系统在不可触摸平台上的行为,否则它是没有意义的。不在“触摸模式”下运行的最佳现代示例是 Android TV。使用方向键控制,我们能够选择或聚焦一个视图,一旦视图聚焦,我们就可以执行点击。
小心 RecyclerView 和触摸模式!假设我们要click action
在view
内部执行 a RecyclerView
。
onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItem(
hasDescendant(withId(R.id.someAction)), click()))
代码很简单,除非您犯了错误并Activity
在禁用的触摸模式下启动测试。
val initialTouchMode = false
val launchActivity = true
@JvmField @Rule var activityRule = ActivityTestRule(
MainActivity::class.java, initialTouchMode, launchActivity
)
你最终会得到的是你的底层点击监听器,不会被解雇,你需要破解并重复click
!
onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItem(
hasDescendant(withId(R.id.someAction)), click()))
.perform(RecyclerViewActions.actionOnItem(
hasDescendant(withId(R.id.someAction)), click()))
这个谜团的答案是通过 XML 膨胀的 RecyclerView 在构造阶段将具有 setFocusableInTouchMode(true) 的事实。我们的整个页面以非触摸模式启动,并将第一次点击解释为焦点事件,所有其他点击都与您在触摸模式下的预期一样。修复就像使用 enabled 启动活动一样简单touch mode
。
val initialTouchMode = true
val launchActivity = true
@JvmField @Rule var activityRule = ActivityTestRule(
MainActivity::class.java, initialTouchMode, launchActivity
)
可以在此链接中找到解释:https ://medium.com/@tom.koptel/espresso-initialtouchmode-can-shoot-you-in-the-leg-85c5f922754