过渡动画比例不会禁用应用程序内部的动画

Transition animation scale does not disable animation inside application

我在做一些 Espresso UI 测试时遇到了一个问题:我想在我的应用程序中禁用动画,这样我就不需要设置 timeouts/need 来等待动画完成.

在我的 android 设备的开发人员选项中禁用 Window 动画比例、过渡动画比例、Animator 持续时间比例不会在使用 [=] 的导航组件在片段之间导航时禁用动画28=]。

动画设置如下:

<action
    android:id="@+id/confirmationAction"
    app:destination="@id/confirmationFragment"
    app:enterAnim="@anim/slide_in_right"
    app:exitAnim="@anim/slide_out_left"
    app:popEnterAnim="@anim/slide_in_left"
    app:popExitAnim="@anim/slide_out_right" />

如何在 运行 我的浓缩咖啡 UI 测试时禁用此动画?

更新:

我关注 this guide of google 关于使用导航组件在片段之间导航的内容。

然后我查看了 google 关于使用 Espresso 测试我的应用程序的指南,并且我发现 the first guide and the second guide 的第一点是通过开发人员选项禁用动画,因此我认为这是禁用动画的正确方法

我遇到了同样的问题,我能想到的最好办法是以编程方式禁用导航动画,以防我 运行 测试:

fun getBuilderWithAdditionalNavOptions(): NavOptions.Builder {
  val optionsBuilder = NavOptions.Builder()
  if (inTest)
    optionsBuilder
      .setEnterAnim(0).setExitAnim(0)
      .setPopEnterAnim(0).setPopExitAnim(0)

  return optionsBuilder
}

其中 inTest 是项目范围的变量,当您 运行 浓缩咖啡测试时设置为 true

经过更多研究,我发现 Espresso 会自动等待 UI 线程上的所有动画完成,然后再执行断言。

通常情况下,如果您使用普通动画,您将无事可做..

如果您必须在 Espresso 测试中等待对 return 值的服务调用,您可以编写一些代码来 (kotlin) 扩展 ViewInteraction class。在你的扩展 class 中,你可以执行检查方法并捕获任何错误。如果有错误,你可以给一个小的超时时间(20ms),然后尝试用 while 循环再次执行。当 2-3 秒后你仍然有异常时,你可以抛出该异常