Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在意式浓缩咖啡的RatingBar上设置特定等级?_Android_Android Espresso_Ratingbar - Fatal编程技术网

Android 如何在意式浓缩咖啡的RatingBar上设置特定等级?

Android 如何在意式浓缩咖啡的RatingBar上设置特定等级?,android,android-espresso,ratingbar,Android,Android Espresso,Ratingbar,我正在试着写一个浓缩咖啡测试,测试一个分级条的选择。如何使用浓缩咖啡设置特定的评分?我只看到click(),它总是设置中间评级。您需要创建ViewAction的自定义子类,在视图上调用setRating,然后将自定义视图操作的实例传递给perform()方法。接受的答案帮助我编写了以下自定义ViewAction: public final class SetRating implements ViewAction { @Override public Matcher<Vi

我正在试着写一个浓缩咖啡测试,测试一个分级条的选择。如何使用浓缩咖啡设置特定的评分?我只看到
click()
,它总是设置中间评级。

您需要创建ViewAction的自定义子类,在视图上调用setRating,然后将自定义视图操作的实例传递给perform()方法。

接受的答案帮助我编写了以下自定义ViewAction:

public final class SetRating implements ViewAction {

    @Override
    public Matcher<View> getConstraints() {
        Matcher <View> isRatingBarConstraint = ViewMatchers.isAssignableFrom(RatingBar.class);
        return isRatingBarConstraint;
    }

    @Override
    public String getDescription() {
        return "Custom view action to set rating.";
    }

    @Override
    public void perform(UiController uiController, View view) {
        RatingBar ratingBar = (RatingBar) view;
        ratingBar.setRating(3);
    }
}
public final类SetRating实现ViewAction{
@凌驾
公共匹配器getConstraints(){
Matcher isRatingBarConstraint=ViewMatchers.isAssignableFrom(RatingBar.class);
返回为RATINGBARCONSTRAINT;
}
@凌驾
公共字符串getDescription(){
返回“自定义视图操作以设置分级。”;
}
@凌驾
公共作废执行(UiController UiController,视图){
RatingBar RatingBar=(RatingBar)视图;
额定杆设置(3);
}
}

您也可以向视图的正确部分发送点击事件,而不是在自定义视图操作中调用
设置评级

这意味着您可以在生产代码中使用
boolean fromUser
参数,避免在设置评级之前将评级条更改侦听器设置为null:

ratingBar.setRating(viewModel.rating());
ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
    @Override
    public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
        if (fromUser) {
            viewModel.actions().onRate(rating);
        }
    }
});

以下操作对我来说已经足够了,因为我的评级栏设置为0.5级,总共有5颗星:

RateableMovieViewModel viewModel = viewModel(userActions).build();
rateableMovieViewHolder.bind(viewModel);

onView(withId(R.id.item_rateable_rating)).perform(setRating(4.5f));

verify(userActions).onRate(4.5f);

private static view动作设置等级(最终浮动等级){
如果(额定值%0.5!=0){
抛出新的IllegalArgumentException(“评级必须是0.5f的倍数”);
}
返回新的ViewAction(){
@凌驾
公共匹配器getConstraints(){
返回isAssignableFrom(RatingBar.class);
}
@凌驾
公共字符串getDescription(){
返回“以0.5f的增量在额定杆上设置额定值”;
}
@凌驾
公共作废执行(UiController UiController,视图){
GeneralClickAction viewAction=新建GeneralClickAction(
单打,
新的协调人提供者(){
@凌驾
公共浮动[]计算坐标(视图){
int[]位置屏幕上=新int[2];
v、 GetLocationOn屏幕(LocationOn屏幕);
int screenX=屏幕上的位置[0];
int screenY=屏幕上的位置[1];
int numStars=((评级栏)视图).getNumStars();
float-widthPerStar=1f*view.getWidth()/numStars;
浮动百分比=额定值/numStars;
float x=screenX+view.getWidth()*百分比;
float y=screenY+view.getHeight()*0.5f;
返回新的浮点[]{x-widthPerStar*0.5f,y};
}
},
按手指,
InputDevice.SOURCE_未知,
MotionEvent.BUTTON_主
);
viewAction.perform(uiController,视图);
}
};
}

isAssignableFrom在这里做什么?@karate你可以在这里找到它:@appoli谢谢你的回答,如果你将它改为ViewMatchers,它会很清楚。isAssignableFrom(RatingBar.class)是现成的!非常感谢。
private static ViewAction setRating(final float rating) {
    if (rating % 0.5 != 0) {
        throw new IllegalArgumentException("Rating must be multiple of 0.5f");
    }

    return new ViewAction() {
        @Override
        public Matcher<View> getConstraints() {
            return isAssignableFrom(RatingBar.class);
        }

        @Override
        public String getDescription() {
            return "Set rating on RatingBar in 0.5f increments";
        }

        @Override
        public void perform(UiController uiController, View view) {
            GeneralClickAction viewAction = new GeneralClickAction(
                    Tap.SINGLE,
                    new CoordinatesProvider() {
                        @Override
                        public float[] calculateCoordinates(View view) {
                            int[] locationOnScreen = new int[2];
                            v.getLocationOnScreen(locationOnScreen);
                            int screenX = locationOnScreen[0];
                            int screenY = locationOnScreen[1];
                            int numStars = ((RatingBar) view).getNumStars();
                            float widthPerStar = 1f * view.getWidth() / numStars;
                            float percent = rating / numStars;
                            float x = screenX + view.getWidth() * percent;
                            float y = screenY + view.getHeight() * 0.5f;
                            return new float[]{x - widthPerStar * 0.5f, y};
                        }
                    },
                    Press.FINGER,
                    InputDevice.SOURCE_UNKNOWN,
                    MotionEvent.BUTTON_PRIMARY
            );
            viewAction.perform(uiController, view);
        }
    };
}