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

27

ActivityTestRule类的构造函数中需要一个initialTouchMode参数。在类参考(或任何在线文档)中没有对此进行解释,除了以下内容:

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

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

2个回答

15

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

触摸模式是视图层次结构的一种状态,仅取决于用户与手机的交互。本身而言,触摸模式非常容易理解,因为它仅表示上次用户交互是否使用了触摸屏幕。

...

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

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


6
谢谢提供链接。这确实解释了什么是触摸模式。现在我唯一的问题是,将ActivityTestRule中的initialTouchMode设置为truefalse会有什么影响? - Adil Hussain
1
例如,如果您正在使用G1手机,选择一个带有轨迹球的小部件将使您退出触摸模式;但是,如果您用手指触摸屏幕上的按钮,则会进入触摸模式。当用户不处于触摸模式时,我们谈论轨迹球模式、导航模式或键盘导航,因此如果您遇到这些术语,请不要感到惊讶。 - jorgeavilae

1

我认为以下来自一篇中文文章的解释可以很好地理解ActivityTestRule中的触摸模式

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

换句话说,当您的手指触摸屏幕时,不会产生副作用。例如,视图不会保持焦点。除非您回忆起Android OS在非可触摸平台上的行为,否则这没有意义。不操作“触摸模式”的最佳现代示例是Android TV。使用D-Pad控制,我们能够选择或聚焦视图,并且一旦视图被聚焦,我们就可以执行单击操作。

要小心RecyclerView和触摸模式!假设我们想对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
)

你最终会得到的是,你的基础点击监听器不会被触发,你需要进行修改并重复点击!
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)。我们整个页面是在非触摸模式下启动的,并将最初的点击解释为焦点事件,而将所有其他点击解释为您在触摸模式下所期望的方式。 修复方法就像启用触摸模式一样简单,只需启动带有启用触摸模式的活动即可。
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接