Как обращаться с кликом в дочерних представлениях и коснуться в родительских группах представлений?
В моем макете у меня есть такая структура:
--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.