Как отловить событие клика по корню для всех детей? - PullRequest
0 голосов
/ 17 сентября 2018

пожалуйста, посмотрите код ниже и скажите мне его решение.

У меня есть вид дерева ниже

<RelativeLayout id="parent">

    <RelativeLayout id="container1">
       <view .../>
    </RelativeLayout>

   <RelativeLayout id="container2">
       <view .../>
    </RelativeLayout>

</RelativeLayout>

в деятельности:

ViewGroup parent = findViewById(R.id.parent);

parent.setOnClickListener(new ...);

Я хочу, чтобы при щелчке на любых дочерних элементах родительского просмотра и дочерних элементах дочерних элементов, событие родительского щелчка будет пожаром.

родительский вид - это ViewHolder для ListView.

Я тестирую много кода, но не работаю

нравится, добавить в родительский корень

android:clickable="true"
android:focusable="true"

и ложь выше для детей, но: (

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Вам необходимо установить прослушиватель щелчков для каждого дочернего элемента, добавляемого к родительскому элементу. Что-то вроде:

private void setChildListener(View parent, View.OnClickListener listener) {
    parent.setOnClickListener(listener);
    if (!(parent instanceof ViewGroup)) {
        return;
    }

    ViewGroup parentGroup = (ViewGroup) parent;
    for (int i = 0; i < parentGroup.getChildCount(); i++) {
        setChildListener(parentGroup.getChildAt(i), listener);
    }
}

Это будет рекурсивно устанавливать каждый просмотр (включая исходный для одного и того же слушателя).

Вы также можете попытаться захватить событие onTouch, украв клики от подпредставлений.

Этот вопрос немного странный для меня. Какое поведение вы собираетесь? Когда пользователь нажимает кнопку, вы хотите, чтобы произошло несколько вещей в зависимости от того, сколько подпредставлений имеет родитель?

0 голосов
/ 18 сентября 2018

Я нашел проблему,

Я использовал android:inputType="text" для textView и после удаления все в порядке.

при использовании android:inputType="text" любые события касания, не передаваемые родителю,: (

0 голосов
/ 17 сентября 2018

Попробуйте использовать OnTouchListener вместо OnClickListener

ViewGroup parent = findViewById(R.id.parent);
parent.setOnTouchListener(new View.OnTouchListener {
    public boolean onTouch(View v, MotionEvent event) {
        //do smth
        return true;
    }
});
...