Espresso: как выполнить прокрутку до элемента в HorizontalScrollView по индексу?
Вот как выглядит мой HorizontalScrollView
:
<HorizontalScrollView
android:layout_below="@id/saved_circuits_title"
android:id="@+id/saved_circuits_scrollview"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/saved_circuits_scroll"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal">
</LinearLayout>
</HorizontalScrollView>
В моем HomeActivity
у меня есть следующий соответствующий код, который заполняет HorizontalScrollView
растровыми изображениями
onCreate{
...
this.savedCircuitsScroll = (LinearLayout) findViewById(R.id.saved_circuits_scroll);
...
}
updateSavedCircuits(){
...// code to make an ImageView from a retrieved bitmap
newImageImage.setOnClickListener(this.thumbnailListener);
this.savedCircuitsScroll.addView(newImageImage);
...
}
Как я могу использовать Espresso для прокрутки до ImageView по указанному индексу в моем HorizontalScrollView и щелкнуть его?
Что я пробовал
У меня нет идентификаторов в моем XML-макете, поэтому такой подход, как Этот не работает:
onView( withId( R.id.button)).perform( scrollTo(), click());
Я знаю, что вы можете щелкнуть по элементу по индексу в a RecyclerView и попытался найти аналогичный подход для HorizontalScrollViews
:
onView(withId(R.id.saved_circuits_scroll))
.perform(HorizontalScrollViewActions.actionOnItemAtPosition(0, click()));
Кроме HorizontalScrollViewActions
не существует.
Или следуя этому блогу я попытался сделать следующее, чтобы хотя бы щелкнуть элемент в HorizontalScrollView
по указанному индексу:
// Click item at position 3
onView(withHorizontalScrollView(R.id.scroll_view).atPosition(3)).perform(click());
// Convenience helper
public static HorizontalScrollViewMatcher withHorizontalScrollView(final int horizontalScrollViewId) {
return new HorizontalScrollViewMatcher(horizontalScrollId);
}
Кроме HorizontalScrollViewMatcher
не существует.
Что мы делаем для HorizontalScrollView
? Это не потомок ScrollView
, поэтому ответ здесь предполагает, что мне нужно реализовать свой собственный обычай ViewAction
. Все, что я хочу сделать, это прокрутить до пункта в списке. HorizontalScrollView
по индексу и нажмите на него. Это действительно необходимо? Если это то, что мне нужно сделать, как я могу реализовать этот обычай ViewAction
?
3 ответа:
В моем случае я получил его с помощью:
onView(allOf(withId(R.id.itemTextView), withEffectiveVisibility(Visibility.VISIBLE), withText(R.string.categories))).perform(scrollTo(), click())
R.id.itemTextView
является ли TextView (с текстомR.string.categories
) динамически добавляемым кLinearLayout
:<HorizontalScrollView> <LinearLayout> ... [child added dynamically] </LinearLayout> </HorizontalScrollView>
Попробуйте добавить этот сопоставитель.
public static Matcher<View> withIdAndParentId(final int viewId, final int parentId) { Assert.assertTrue(viewId != -1); Assert.assertTrue(parentId != -1); return new TypeSafeMatcher<View>() { @Override public void describeTo(Description description) { } @Override public boolean matchesSafely(View view) { return view.getId() == viewId && isThereParentWithIdInHierarchy(view); } private boolean isThereParentWithIdInHierarchy(View view) { ViewParent viewParent = view.getParent(); if (viewParent == null || !(viewParent instanceof ViewGroup)) return false; ViewGroup parent = (ViewGroup) viewParent; return parent.getId() == parentId || isThereParentWithIdInHierarchy(parent); } }; }
Вот как его использовать:
onView(withIdAndParentId(R.id.YOUR_PARTICULAR_VIEW_ID, R.id.horizontalScrollViewId)).perform(scrollTo(), click());
Надеюсь, это поможет.
Итак, в моем конкретном случае я обнаружил, что мои представления свитков не имеют никакого идентификатора, связанного с ними (или ни одного, до которого я мог бы разумно добраться, следовательно, я не мог использовать ответ Моди). Тем не менее, у них был тег, связанный с ними, поэтому я мог использовать эспрессо withTagValue ViewMatcher вместо этого. Каждый вид был связан с объектом circuitProject (конечно, для вас это может быть по-разному). И у меня есть доступ к следующему:
ArrayList<CircuitProject> circuitProjects = new ArrayList<>();
Индекс объекта
circuitProject
оказывается следующим: положение ассоциированного представления вHorizontalScrollView
. Тег-это папка, в которую сохраняется объектcircuitProject
. Отсюда легко получить нужное мне поведение при прокрутке эспрессо до определенного индекса вHorizontalScrollView
:onView(withTagValue(withStringMatching(circuitProject.getFolderID()))).perform(scrollTo(), click());