How to handle touch event for child view in parent view

I create my own calendar view that extends LinearLayout and has child views for each date. What I want to do is process the napkins and click, as you can imagine, swipe your finger over the month and press to select a date and display the new activity. For this, I use the GestureDetector for CalendarView and I can make it work for scrolling. But to handle the click event, I don't know how to find the child view that clicked.

  • Does anyone have an idea to solve this?
  • What is the difference between return true and false in OnScroll (MotionEvent)?

The following is part of my codes.

public class MonthView extends LinearLayout implements GestureDetector.OnGestureListener {

    public MonthView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        gestureDetector = new GestureDetector(this);
        initDateViews();
    }

    //other codes here
    ....

    private void initDateViews() {
        for(int i = 0; i < 42; i++) {
            DateView view = new DateView();
            //init date views and add to calendar view.
            ....
            calendar.Add(view);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Logger.debug(TAG, ">>> MonthView.onTouchEvent()");

        return gestureDetector.onTouchEvent(event);
    }

    @Override
    public boolean OnSingleTapUp(MotionEvent event) {
        // how can I find a child view to handle click event?
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        // right to left
        if (e1.getX() - e2.getX() > minSwipeDistance) {
            this.prevMonth();
        }
        // left to right
        else if(e2.getX() - e1.getX() > minSwipeDistance) {
            this.nextMonth();
        }
        // bottom to top
        else if(e1.getY() - e2.getY() > minSwipeDistance) {
            this.prevMonth();
        }
        //top to bottom
        else if(e2.getY() - e1.getY() > minSwipeDistance) {
            this.nextMonth();
        }

        return false;
    }

    ....
}
+4
2

, 'onInterceptTouchEvent()' MonthView , -, . GestureDetector, onFling(), .

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean result = gestureDetector.onTouchEvent(event);

    return result;
}

@Override
public boolean onDown(MotionEvent e) {
    return false;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    // right to left
    if (e1.getX() - e2.getX() > minSwipeDistance) {
        nextMonth();
    }
    // left to right
    else if(e2.getX() - e1.getX() > minSwipeDistance) {
        prevMonth();
    }
    // bottom to top
    else if(e1.getY() - e2.getY() > minSwipeDistance) {
        nextMonth();
    }
    //top to bottom
    else if(e2.getY() - e1.getY() > minSwipeDistance) {
        prevMonth();
    }

    return true;
}

@Override
public void onLongPress(MotionEvent e) {
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    return false;
}

@Override
public void onShowPress(MotionEvent e) {
}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    return false;
}
0

on[GestureEvent] , . , onScroll true, .

onSingleTapUp false, , .

OnClickListener, :

private void initDateViews() {
    for(int i = 0; i < 42; i++) {
        DateView view = new DateView();
        //init date views and add to calendar view.
        ....

        // register onClickListener for e.g. date
        view.setOnCLickListener(new DateOnClickListner(date))
        calendar.Add(view);
    }
}

OnClickListener,

class DateOnClickListner(Date date) extends View.OnClickListener {
    public void onClick(View v) {
        ...
    }
}
+1

Source: https://habr.com/ru/post/1606038/


All Articles