Как делегировать событие клика от parent (ViewGroup) к child (View) android?
Можно конечно через луп присвоить всем дочерним вью onclick, но есть ли такая возможность как повесить событие клика на родительский элемент, а затем получать событие на нужном дочернем вью, как, например, в html/js через event currentTarget?
Ответы (1 шт):
Можно. Самый простой вариант - вешать слушатель onClick прям на сам объект =) Если поподете по одному из внутренних объектов - вызовится его онклик, если по пространсву между объектами, но ов ViewGroup - вызовется онклик для контейнера. Напомню, что всем им можно задать одну и ту же реализацию onClickListener и внутри метода выяснять по какому элементу ткнули, в параметрах придет именно та вьюшка, по которой попал пользователь
Если по каким-то причинам нельзя вешать слушатели на вьюшки, то можно повесить толкьо на пэрента, но тогда клик слушать надо не через OnClickListener, а через метод onTouchEvent. Его нужно переопределять, потому вам придется создать свой класс-наследник от нужного ViewGroup
public class MyViewGroup extends FrameLayout{
//конструкторы
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
//когда пользователь положил палец на экран
break;
}
case MotionEvent.ACTION_UP: {
findChildInCords(event.getX(), event.getY())
break;
}
}
return true;
}
}
в методе findChildInCoords перебираете всех детей вашего контейнера и проверяете вписываются ли они своими локальными координатами в переданную точку. Помним что чем позже в списке детей контейнера находим вюшку, тем выше она отображается, потому перебирать надо с конца. Первая попавшая в эту точку вьюшка и будет наша кликнутая, делаем с ней что надо