看来CoordinatorLayout破坏了诸如scrollTo()RecyclerViewActions.scrollToPosition()之类的Espresso操作的行为。
NestedScrollView的问题
对于这样的布局:

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        ...

    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        ...

    </android.support.design.widget.AppBarLayout>

</android.support.design.widget.CoordinatorLayout>
如果我尝试使用NestedScrollView滚动到ViewActions.scrollTo()内部的任何 View ,则发现的第一个问题是我得到了PerformException。这是因为此操作仅支持ScrollView,而NestedScrollView不扩展它。 here解释了此问题的解决方法,基本上,我们可以将代码复制到scrollTo()中,并更改约束以支持NestedScrollView。如果NestedScrollView不在CoordinatorLayout中,但是将其放入CoordinatorLayout中后,滚动操作将失败,这似乎可行。
RecyclerView的问题
对于相同的布局,如果我将NestedScrollView替换为RecyclerView,则滚动也会出现问题。
在这种情况下,我使用的是RecyclerViewAction.scrollToPosition(position)。与NestedScrollView不同,在这里我可以看到一些滚动发生的情况。但是,它看起来像滚动到错误的位置。例如,如果我滚动到最后一个位置,则会显示倒数第二个而不是最后一个。当我将RecyclerViewCoordinatorLayout中移出时,滚动会按预期进行。
由于这个问题,目前我们无法为使用CoordinatorLayout的屏幕编写任何Espresso测试。任何人遇到相同的问题或知道解决方法吗?

最佳答案

发生这种情况是因为Espresso scrollTo()方法显式检查布局类,并且仅适用于ScrollView和Horizo​​ntalScrollView。在内部,它使用View.requestRectangleOnScreen(...),所以我希望它在许多布局中都能正常工作。

NestedScrollView的解决方法是采用ScrollToAction并修改该约束。进行此更改后,修改后的操作对于NestedScrollView来说效果很好。

ScrollToAction类中更改的方法:

public Matcher<View> getConstraints() {
    return allOf(withEffectiveVisibility(Visibility.VISIBLE), isDescendantOfA(anyOf(
            isAssignableFrom(ScrollView.class), isAssignableFrom(HorizontalScrollView.class), isAssignableFrom(NestedScrollView.class))));
}

方便的方法:
public static ViewAction betterScrollTo() {
    return ViewActions.actionWithAssertions(new NestedScrollToAction());
}

关于android - espresso ,当NestedScrollView或RecyclerView在CoordinatorLayout中时,滚动不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35272953/

10-12 06:00