Java Android Espresso,我如何才能只执行长按并向下滑动继续? 我的意思是,我可以按顺序执行这两个动作,但是在中间有一个 ActudioUp> MyToCon事件,我删除了我在视图上使用的OnTouChistListar。

Java Android Espresso,我如何才能只执行长按并向下滑动继续? 我的意思是,我可以按顺序执行这两个动作,但是在中间有一个 ActudioUp> MyToCon事件,我删除了我在视图上使用的OnTouChistListar。,java,android,testing,android-espresso,Java,Android,Testing,Android Espresso,就我而言,我需要避免触发那个事件 我有一个有玩家的运动场,其中一个用例是长点击后移动一个玩家,该功能运行良好,但我无法在测试中重现该功能 这是我想测试的类的代码,我试图浓缩与问题相关的所有代码 公共类足球场布局扩展了RelativeLayout实现View.OnTouchListener{ [...] 公共玩家(现场玩家){ 最终FieldPlayerView fpv=新的FieldPlayerView(getContext(),播放器); addView(fpv); fpv.setOnLon

就我而言,我需要避免触发那个事件

我有一个有玩家的运动场,其中一个用例是长点击后移动一个玩家,该功能运行良好,但我无法在测试中重现该功能

这是我想测试的类的代码,我试图浓缩与问题相关的所有代码

公共类足球场布局扩展了RelativeLayout实现View.OnTouchListener{
[...]
公共玩家(现场玩家){
最终FieldPlayerView fpv=新的FieldPlayerView(getContext(),播放器);
addView(fpv);
fpv.setOnLongClickListener(新的OnLongClickListener(){
@凌驾
仅长按公共布尔值(视图v){
v、 setOnTouchListener(足球场布局,this);
返回true;
}
});
}
[...]
公共浮动dX=无增量,dY=无增量;
@凌驾
公共布尔onTouch(视图、运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u移动:
如果(dX==NO_DELTA | | dY==NO_DELTA){setDelta(视图,事件);}
view.animate()
.x(event.getRawX()+dX)
.y(event.getRawY()+dY)
.setDuration(0)
.start();
打破
case MotionEvent.ACTION\u UP:
view.setOnTouchListener(null);
重置增量();
打破
违约:
返回false;
}
返回true;
}
}
这是测试

公共类移动LongClickActivityTest{
[...]
@试验
public void playerCanbeMovedvertialAfterLongClick()引发中断异常{
onView(带id(R.id.activity_字段))。检查(匹配项(isDisplayed());
View=mActivityRule.getActivity().findViewById(R.id.test\u播放器);
float[]begincord={view.getX(),view.getY()};
onView(带id(R.id.test_player)).perform(longClick());
onView(带id(R.id.test_player)).perform(swipdown());
float[]endCoord={view.getX(),view.getY()};
资产(Begincord[1],而非(equalTo(endCoord[1]));
}
}

我总是使用框架的ViewActions,或者使用另一个人的配方来改变某些事情,但我从未尝试构建复杂的ViewAction,我有点迷茫。

我已经看到了您在我的问题下的评论。事实上,我现在也遇到了同样的问题(有Injectu事件许可,我的所有变通方法都无法处理)。我在半年前就使用了这个代码,它对我来说没有任何问题

我可以为您提出其他解决方案,但我不能100%肯定它会起作用。因为我现在创造的速度非常快。我以后可能有更多的时间来看看

但请尝试以下解决方案:

  • 试着写下你自己的一般动作。看看构造器:

    public GeneralSwipeAction(Swiper swiper, CoordinatesProvider startCoordinatesProvider, CoordinatesProvider endCoordinatesProvider, PrecisionDescriber precisionDescriber) {
        this.swiper = swiper;
        this.startCoordinatesProvider = startCoordinatesProvider;
        this.endCoordinatesProvider = endCoordinatesProvider;
        this.precisionDescriber = precisionDescriber;
    }
    
  • 因此,起点/终点的x、y位置通过CoordinateProvider类发送。它是一个返回浮点数组的接口。数组中的第一个浮点数表示x,第二个浮点数表示y

  • 创建自己的类实现坐标提供程序:

    import android.support.test.espresso.action.CoordinatesProvider;
    import android.view.View;
    
    public class CustomisableCoordinatesProvider implements CoordinatesProvider {
    
        private int x;
        private int y;
    
        public CustomisableCoordinatesProvider(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        @Override
        public float[] calculateCoordinates(View view) {
            return new float[]{x,y};
        }
    }
    
  • 使用此CustomisableCoordinateProvider实现执行拖动的自定义ViewAction:

    public static ViewAction drag(int startX, int startY, int endX, int endY) {
        return new GeneralSwipeAction(
            Swipe.FAST,
            new CustomisableCoordinatesProvider(startX, startY),
            new CustomisableCoordinatesProvider(endX, endY),
            Press.FINGER);
    }
    
  • 试着这样使用它:

    onView(withId(R.id.test_player)).perform(drag(0, 100, 0, 100));
    

  • 我还没有测试过。但它可能会工作或帮助您指向正确的方向。尝试一下,告诉我它是否有效,我自己也很好奇:)

    我将使用来探索一个可能的解决方案,我会检查它,但在我的主要问题中,我想重新创建onlongclick和swipe,而不使用ACTION\u UP事件。如果你的答案帮助我解决了这个问题,我会把它标记为正确的。因为(1)没有经过测试,(2)不起作用(遇到安全异常)。