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

ти, я хотел бы присоединить один OnClickListener к нескольким представлениям внутри ConstraintLayout.

Перед миграцией в ConstraintLayout представления внутри одного макета, в который я мог бы добавить слушателя. Теперь они находятся в одном слое с другими представлениями прямо под ConstraintLayout.

Я пытался добавить представления кandroid.support.constraint.Group и добавил OnClickListener к нему программно.

group.setOnClickListener {
    Log.d("OnClick", "groupClickListener triggered")
}

Однако это не похоже на работу с версией ConstraintLayout1.1.0-beta2

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

Ответы на вопрос(1)

Решение Вопроса

Group вConstraintLayout это просто свободная ассоциация взглядов AFAIK. Это неViewGroupТаким образом, вы не сможете использовать прослушиватель одним щелчком мыши, как вы делали, когда представления были вViewGroup.

В качестве альтернативы вы можете получить список идентификаторов, которые являются членами вашегоGroup в вашем коде и явно установите прослушиватель кликов.(Я не нашел официальной документации по этой функции, но я считаю, что она просто отстает от выпуска кода.) Смотрите документацию поgetReferencedIds Вот.

Ява:

    Group group = findViewById(R.id.group);
    int refIds[] = group.getReferencedIds();
    for (int id : refIds) {
        findViewById(id).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // your code here.
            }
        });
    }

В Kotlin вы можете создать для этого функцию расширения.

Котлин:

    fun Group.setAllOnClickListener(listener: View.OnClickListener?) {
        referencedIds.forEach { id ->
            rootView.findViewById<View>(id).setOnClickListener(listener)
        }
    }

Затем вызовите функцию для группы:

    group.setAllOnClickListener(View.OnClickListener {
        // code to perform on click event
    })
 Ivan Wooll15 мар. 2018 г., 11:51
Я люблю функции расширения!
 lucas_sales05 окт. 2018 г., 09:16
Просто чтобы выглядеть более котлиниш я внес небольшое изменениеfun Group.setAllOnClickListener(listener: (View) -> Unit) { referencedIds.forEach { id -> rootView.findViewById<View>(id).setOnClickListener(listener) } }
 Guilherme Lima Pereira25 июн. 2018 г., 15:04
Расширение kotlin не сработало для меня: попытка вызвать виртуальный метод 'void android.view.View.setOnClickListener (android.view.View $ OnClickListener)' для пустой ссылки на объект
 Jeff Barger30 июл. 2018 г., 23:24
Будьте осторожны при этом - ConstraintLayout Group предназначена для управлениявидимость, Я просто получил немного от этого - мы пытались использовать группу, чтобы иметь возможность установить прослушиватель общего щелчка, как этот ответ, но также хотели установить видимость одного из представлений за пределами группы, и это не работай.

Ваш ответ на вопрос