【问题标题】:What is touch mode and why is it important for the *ActivityTestRule* class?什么是触摸模式,为什么它对 *ActivityTestRule* 类很重要?
【发布时间】:2016-03-13 12:07:05
【问题描述】:

android.support.test.rule.ActivityTestRule 类(请参阅here)在其构造函数中接收initialTouchMode 参数。课程参考(或在线任何地方)中没有解释这一点,除非如下:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    触摸模式是视图层次结构的一种状态,它完全取决于用户与手机的交互。就其本身而言,触摸模式非常容易理解,因为它只是指示上次用户交互是否是通过触摸屏进行的。

    ...

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

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

    【讨论】:

    • 感谢您的链接。这可以肯定地解释什么是触摸模式。我现在唯一的问题是将ActivityTestRule 中的initialTouchMode 设置为truefalse 的含义是什么?
    • 来自该链接:例如,如果您使用的是 G1 手机,选择带有轨迹球的小部件将使您脱离触控模式;但是,如果您用手指触摸屏幕上的按钮,您将进入触摸模式。当用户不处于触摸模式时,我们谈论的是轨迹球模式、导航模式或键盘导航,所以如果您遇到这些术语,请不要感到惊讶。
    【解决方案2】:

    我认为以下来自中篇文章的解释非常好理解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

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2010-12-03
      • 1970-01-01
      • 2013-03-19
      • 2022-01-22
      相关资源
      最近更新 更多