我认为以下来自中篇文章的解释非常好理解touch mode in ActivityTestRule。
'在触摸模式下,没有焦点,也没有选择。'
换句话说,当您的手指触摸屏幕时,它不会产生副作用。例如,视图不会保持焦点。除非您回想起 Android 操作系统在不可触摸平台上的行为,否则它是没有意义的。不在“触摸模式”下运行的最佳现代示例是 Android TV。使用方向键控制,我们可以选择或聚焦一个视图,一旦视图聚焦,我们就可以执行点击。
小心 RecyclerView 和触摸模式!
假设我们要在RecyclerView 内的view 上执行click action。
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)。我们的整个页面以非触摸模式启动,并将第一次点击解释为焦点事件,所有其他点击都与您在触摸模式下的预期一样。
修复就像在启用 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