Как обращаться с кликом в дочерних представлениях и коснуться в родительских группах представлений?

В моем макете у меня есть такая структура:

--RelativeLayout
  |
  --FrameLayout
    |
    --Button, EditText...

Я хочу обрабатывать события касания в RelativeLayout и в FrameLayout, поэтому я устанавливаю onTouchListener в этих двух группах представления. Но зафиксировано только касание RelativeLayout.

Чтобы попробовать это, я написал свой собственный CustomRelativeLayout и переопределив onInterceptTouchEvent, теперь щелчок в дочерней группе ViewGroup (FrameLayout) захвачен, но щелчок на кнопках и других представлениях не оказывает никакого влияния.

В моем собственном макете у меня есть следующее:

public boolean onInterceptTouchEvent(MotionEvent ev) {
    return true;
}

Ответ 1

Вам нужно переопределить onInterceptTouchEvent() для каждого дочернего элемента, иначе он останется onTouchEvent для родителя.

Перехватить сенсорные события в ViewGroup

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    /*
    * This method JUST determines whether we want to intercept the motion.
    * If we return true, onTouchEvent will be called and we do the actual
    * scrolling there.
    */
...
    // In general, we don't want to intercept touch events. They should be 
    // handled by the child view.
    return false;
}

Вам нужно вернуть значение false, чтобы дочерний элемент обработал его, иначе вы возвращаете его родительскому.

Ответ 2

Ваше пользовательское решение будет захватывать события касания из любого места в вашем относительном макете, поскольку переопределенный метод всегда задает значение true.

Для вашего требования я думаю, что его лучше использовать метод onClick, а не использование onTouch.

Метод OnTouch вызывает различные потоки для каждого TouchEvent, и я думаю, что это является причиной вашей проблемы.

Вместо того, чтобы обрабатывать эти события, лучше попробовать метод onClick.