只有当视图包含浮动操作按钮时才显示小吃栏时,Android espresso测试会冻结

时间:2017-11-07 08:20:42

标签: android floating-action-button android-espresso coordinator-layout

我认为这是一个错误,但我可能做错了。

我的布局非常简单,只包含一个浮动操作按钮:

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/contentCoordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:id="@+id/layoutWithoutContent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

</LinearLayout>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/stopButton"
    android:src="@drawable/ic_stop_white_24px"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="16dp"
    android:layout_marginBottom="16dp"
    app:layout_anchor="@id/layoutWithoutContent"
    app:backgroundTint="@color/colorPrimary"
    app:layout_anchorGravity="bottom|right|end"/>

我的活动仅继承包含以下内容的onCreate方法:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    CoordinatorLayout coordinatorLayout = findViewById(R.id.contentCoordinatorLayout);
    Snackbar.make(coordinatorLayout, R.string.snackbar_message, Snackbar.LENGTH_LONG).show();

}

我写了一个Espresso测试,它只验证Snackbar在第二个显示的位置。

@Rule
public ActivityTestRule<MainActivity> mainActivity = new ActivityTestRule<>(MainActivity.class, true, true);

@Test
public void testSnackbarIsShown() throws Exception {        onView(withText(R.string.snackbar_message)).check(matches(isDisplayed()));
}

当我调试此测试时,{/ 1}}在小吃栏消失后执行

到目前为止,我已找到3种方法来解决此问题,问题在以下情况得到解决:

  • 我将FloatingActionButton的anchorGravity更改为top:onView(withText(R.string.snackbar_message)).check(matches(isDisplayed()));

  • 我完全删除了FloatingActionButton

  • 将Snackbar的第一个参数更改为使用app:layout_anchorGravity="top|right|end"。但是当小吃栏出现时,这并没有推动FloatingActionButton。

正如我所说,我认为这是一个错误,但如果我在这里做错了,请告诉我。

1 个答案:

答案 0 :(得分:2)

关于在xml中构建布局的方式,当Snackbar与FAB按钮交互时,UI会不断更新。

您找到的三个解决方案有一个共同点,它们消除了Snackbar和FAB按钮之间的交互。当您将重力设置为TOP时,Snackbar不会按下按钮,因为它们位于屏幕的不同端。完全删除FAB按钮时,也没有任何交互。当您更改视图并传递给Snackbar构建器时,由于Snackbar显示在按钮顶部,因此也没有任何交互。

如果您在设置&gt;中启用Show Surface Updates开发人员选项,您将实际看到在显示Snakcbar时UI正在更新。 Espresso轮询UI线程,试图查找它何时空闲。由于Snackbar使UI线程保持忙碌,Espresso不会运行测试代码,直到Snackbar消失。

似乎与:

有关
app:layout_anchor="@id/layoutWithoutContent"
app:layout_anchorGravity="bottom|right|end"

如果用以下内容替换它们:

android:layout_gravity="bottom|end"

生成的布局看起来相同,测试运行正常。如果您启用了Show Surface Updates,则会在显示Snackbar时看到UI未更新。