我还想根据其之前的状态来切换复选框/开关。起初,我尝试用此方法打开一个关闭的复选框:
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
...这可以关闭打开的复选框:
onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
然而,这不起作用,因为 Espresso 将在执行操作之前寻找特定的切换状态。有时,您事先并不知道它是打开还是关闭。
我的解决方案是使用自定义 ViewAction 来关闭/打开任何不依赖于先前状态的可检查对象(开关、复选框等)。因此,如果它已经打开,它将保持打开状态。如果它是关闭的,它将切换为打开。这是视图操作:
public static ViewAction setChecked(final boolean checked) {
return new ViewAction() {
@Override
public BaseMatcher<View> getConstraints() {
return new BaseMatcher<View>() {
@Override
public boolean matches(Object item) {
return isA(Checkable.class).matches(item);
}
@Override
public void describeMismatch(Object item, Description mismatchDescription) {}
@Override
public void describeTo(Description description) {}
};
}
@Override
public String getDescription() {
return null;
}
@Override
public void perform(UiController uiController, View view) {
Checkable checkableView = (Checkable) view;
checkableView.setChecked(checked);
}
};
}
以下是如何使用它(在本例中,当您想要切换到“开”时):
onView(withId(R.id.toggle)).perform(scrollTo(), setChecked(true));