Как проверить, равны ли два StateListDrawable(s)?
Я пытаюсь написать тест, чтобы проверить, имеет ли моя ViewGroup правильный фон. Я использую Espresso и Hamcrest для теста.
Это XML-файл, который я использовал для фона моей ViewGroup(RelativeLayout).
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:radius="4dp" />
<solid android:color="@color/gray" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<corners android:radius="4dp" />
<solid android:color="@color/white" />
<stroke
android:width="1dp"
android:color="@color/colorPrimaryDark" />
</shape>
</item>
</selector>
Попытка 1
Я следовал коду от programcreek.com и получаю GradientDrawable
после getCurrent
называется на обоих expectedDrawable
а также actualDrawable
, поскольку GradientDrawable
в примере не рассматривается, я попытался добавить несколько кодов, надеясь, что это сработает.
public static Matcher<View> withBgDrawable(final int expectedResourceId) {
return new TypeSafeMatcher<View>() {
@Override
public boolean matchesSafely(View view) {
Drawable actualDrawable = view.getBackground();
if (expectedResourceId < 0) return actualDrawable == null;
Drawable expectedDrawable = ContextCompat.getDrawable(view.getContext(), expectedResourceId);
if (expectedDrawable == null) return false;
if (actualDrawable instanceof StateListDrawable) {
actualDrawable = actualDrawable.getCurrent();
}
if (expectedDrawable instanceof StateListDrawable) {
expectedDrawable = expectedDrawable.getCurrent();
}
if (expectedDrawable instanceof GradientDrawable) {
return actualDrawable instanceof GradientDrawable && gradientToBitmap((GradientDrawable) expectedDrawable)
.sameAs(gradientToBitmap((GradientDrawable) actualDrawable));
}
throw new IllegalArgumentException("Unsupported drawable: " + actualDrawable);
}
@Override
public void describeTo(Description description) {
description.appendText("with drawable ");
}
};
}
private static Bitmap gradientToBitmap(GradientDrawable gradientDrawable) {
Bitmap bitmap = Bitmap.createBitmap(gradientDrawable.getIntrinsicWidth(), gradientDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
gradientDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
gradientDrawable.draw(canvas);
return bitmap;
}
это ошибка, которую я получаю.
java.lang.IllegalArgumentException: ширина и высота должны быть> 0
Итак, я записал значение gradientDrawable.getIntrinsicWidth()
чтобы увидеть, что происходит, и обнаружил, что это было -1
,
Попытка 2
Затем я попытался изменить те StateListDrawable
(s) прямо в Bitmap
(Ы). Я получаю ту же ошибку, что и попытка 1.
public static Matcher<View> withBgDrawable(final int expectedResourceId) {
return new TypeSafeMatcher<View>() {
@Override
public boolean matchesSafely(View view) {
Drawable actualDrawable = view.getBackground();
if (expectedResourceId < 0) return actualDrawable == null;
Drawable expectedDrawable = ContextCompat.getDrawable(view.getContext(), expectedResourceId);
if (expectedDrawable == null) return false;
if (expectedDrawable instanceof StateListDrawable) {
return actualDrawable instanceof StateListDrawable && stateListToBitmap((StateListDrawable) expectedDrawable)
.sameAs(stateListToBitmap((StateListDrawable) actualDrawable));
}
throw new IllegalArgumentException("Unsupported drawable: " + actualDrawable);
}
@Override
public void describeTo(Description description) {
description.appendText("with drawable ");
}
};
}
private static Bitmap stateListToBitmap(StateListDrawable stateListDrawable) {
Bitmap bitmap = Bitmap.createBitmap(stateListDrawable.getIntrinsicWidth(), stateListDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
stateListDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
stateListDrawable.draw(canvas);
return bitmap;
}
Попытка 3
Если я просто использую equals
или же ==
либо на StateListDrawable
или же GradientDrawable
Drawables из того же XML-файла не совпадают.
android.support.test.espresso.base.DefaultFailureHandler $ AssertionFailedWithCauseError: "with drawable" не соответствует выбранному представлению.