Как делегировать событие клика от 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 перебираете всех детей вашего контейнера и проверяете вписываются ли они своими локальными координатами в переданную точку. Помним что чем позже в списке детей контейнера находим вюшку, тем выше она отображается, потому перебирать надо с конца. Первая попавшая в эту точку вьюшка и будет наша кликнутая, делаем с ней что надо

→ Ссылка