看来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
不同,在这里我可以看到一些滚动发生的情况。但是,它看起来像滚动到错误的位置。例如,如果我滚动到最后一个位置,则会显示倒数第二个而不是最后一个。当我将RecyclerView
从CoordinatorLayout
中移出时,滚动会按预期进行。由于这个问题,目前我们无法为使用
CoordinatorLayout
的屏幕编写任何Espresso测试。任何人遇到相同的问题或知道解决方法吗? 最佳答案
发生这种情况是因为Espresso scrollTo()方法显式检查布局类,并且仅适用于ScrollView和HorizontalScrollView。在内部,它使用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/