25

该类android.support.test.rule.ActivityTestRule(参见此处initialTouchMode在其构造函数中接收一个参数。这在类参考(或在线任何地方)中没有解释,除非如下:

initialTouchMode - 如果 Activity 在启动时应置于“触摸模式”,则为 true

“触摸模式”究竟是什么意思?initialTouchMode设置到or的含义是ActivityTestRule什么?(我看到这个参数的默认值是)。truefalsefalse

4

2 回答 2

15

触摸模式会影响视图焦点和选择的工作方式。

触摸模式是视图层次结构的一种状态,仅取决于用户与手机的交互。就其本身而言,触摸模式很容易理解,因为它简单地表明最后一次用户交互是否是通过触摸屏进行的。

...

在触摸模式下,没有焦点,也没有选择。

http://android-developers.blogspot.com/2008/12/touch-mode.html

于 2016-03-13T22:28:33.100 回答
1

我认为以下来自中等文章的解释非常好理解touch modeActivityTestRule

“在触摸模式下,没有焦点,也没有选择。”

换句话说,当您的手指触摸屏幕时,它不会产生副作用。例如,视图不会保持焦点。除非您回想起 Android 操作系统在不可触摸平台上的行为,否则它是没有意义的。不在“触摸模式”下运行的最佳现代示例是 Android TV。使用方向键控制,我们能够选择或聚焦一个视图,一旦视图聚焦,我们就可以执行点击。

小心 RecyclerView 和触摸模式!假设我们要click actionview内部执行 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

于 2020-03-04T22:37:08.780 回答