How can I use OnClickListener in Parent View and onTouchEvent in Child View?

I have a custom layout with a standard setOnClickListener () call.

setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // some click related code
            }
        });

      

This layout has a view that should be dragged horizontally.

I wrote some code and it does more or less what I want:

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean result = true;
    final int action = event.getAction();
    final float x = event.getRawX();
    final float y = event.getRawY();
    switch (action) {
        case MotionEvent.ACTION_DOWN: {
            mInitialTouchX = x;
            mInitialTouchY = y;

            mStartX = getX();
            mStartY = getY();
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            Logger.d("MOVE");
            if (direction == -1) {

            }

            final float dx = x - mInitialTouchX;
            final float dy = y - mInitialTouchY;

            mPosX = mStartX + dx;
            mPosY = mStartY + dy;

            if (Math.abs(dx) > SWYPE_MIN_TRAVEL) {
                if (Math.abs(mPosX) < maximumSwypeDistance) {
                    setTranslationX(mPosX);
                }
            }

            break;
        }
        case MotionEvent.ACTION_UP:
            Logger.d("UP");
        case MotionEvent.ACTION_CANCEL:
            Logger.d("CANCEL");
        case MotionEvent.ACTION_POINTER_UP:
            Logger.d("POINTER_UP");
            final float dx = x - mInitialTouchX;
            if (Math.abs(dx) < SWYPE_MIN_TRAVEL) {
                Logger.d("click");
                result = false;
            }
            break;
    }
    return result;
}

      

The question is, how do I have both?

Edit: Ok, using the answer from the Gunnar Karlssons event, I could change the code to manually click into an ACTION_UP

Event like this:

((ViewGroup) this.getParent()).performClick();

      

I cannot help myself, but I find it somewhat unsatisfactory. Am I there for a more elegant solution?

+3


source to share


1 answer


The short answer is yes, you can achieve this behavior. The long answer is that you need to ensure that both views receive touch events as you expect. Depending on the exact layouts and expected behavior, you can use several methods:



  • You don't need to return true from onTouchEvent () - this way the touch event will also be dispatched to the parent object (just make sure you receive the next event).
  • Use onInterceptTouchEvent () on parent and detect click with GestureDetector and SimpleOnGestureListener.

    GestureDetector.SimpleOnGestureListener simpleOnGestureListener = new GestureDetector.SimpleOnGestureListener(){
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            // some click related code
            return true;
        }
    };
    
    GestureDetector gestureDetector = new GestureDetector(context, simpleOnGestureListener);
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent e){
        gestureDetector.onTouchEvent(e);
        return false;
    }
    
          

0


source







All Articles