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 2

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());