什么是触摸模式?为什么它对* ActivityTestRule *类很重要?

时间:2016-03-13 12:07:06

标签: android android-testing android-espresso android-instrumentation android-junit

android.support.test.rule.ActivityTestRule类(请参阅here)在其构造函数中包含initialTouchMode参数。除了以下内容之外,在类引用(或任何在线)中没有解释这一点:

  

initialTouchMode - 如果应将活动放入"触摸模式"什么时候开始

究竟是什么"触摸模式"意思?将initialTouchMode ActivityTestRule设置为truefalse会产生什么影响? (我看到此参数的默认值为false)。

2 个答案:

答案 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