android.support.test.rule.ActivityTestRule
类(请参阅here)在其构造函数中包含initialTouchMode
参数。除了以下内容之外,在类引用(或任何在线)中没有解释这一点:
initialTouchMode - 如果应将活动放入"触摸模式"什么时候开始
究竟是什么"触摸模式"意思?将initialTouchMode
ActivityTestRule
设置为true
或false
会产生什么影响? (我看到此参数的默认值为false
)。
答案 0 :(得分:13)
触摸模式会影响视图焦点和选择的工作方式。
触摸模式是视图层次结构的状态,仅取决于用户与电话的交互。触摸模式本身就非常容易理解,因为它只是指示最后一次用户交互是否是通过触摸屏执行的。
...
在触控模式下,没有焦点也没有选择。
http://android-developers.blogspot.com/2008/12/touch-mode.html
答案 1 :(得分:0)
我认为,这篇中等文章的以下解释非常适合理解touch mode
中的ActivityTestRule
。
“在触摸模式下,没有焦点,也没有选择。”
换句话说,当您的手指触摸屏幕时,不会产生副作用。例如,视图将无法保持焦点。除非您回忆起不可触摸平台上的Android OS行为,否则这没有任何意义。不能在“触摸模式”下运行的最好的现代示例是Android TV。借助D-Pad控件,我们能够选择或聚焦视图,并且一旦聚焦了视图,我们就可以执行点击操作。
在使用RecyclerView和触摸模式时要小心! 假设我们要在
click action
内的view
上执行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)。我们的整个页面都是在非触摸模式下启动的,并且将大多数首次点击解释为焦点事件,并将所有其他点击解释为您在触摸模式下所期望的。 该修补程序就像启用了
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