在ConstraintLayout中使用group监听多个view的点击事件

新手上路,请多包涵

基本上我想将单个 OnClickListener 附加到 ConstraintLayout 内的多个视图。

在迁移到 ConstraintLayout 之前,我可以在一个布局中添加一个侦听器的视图。现在它们与 ConstraintLayout 下的其他视图位于同一层。

我尝试将视图添加到 android.support.constraint.Group 并以编程方式向其添加 OnClickListener。

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

然而,这似乎不适用于 ConstraintLayout 版本 1.1.0-beta2

我做错了什么,有没有办法实现这种行为,或者我是否需要将监听器附加到每个单独的视图?

原文由 Endzeit 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

Group 中的 ConstraintLayout 只是一个松散的视图关联AFAIK。它不是 ViewGroup ,因此您将无法像视图位于 ViewGroup 时那样使用单击侦听器。

作为替代方案,您可以在代码中获取属于您的 Group 成员的 ID 列表,并明确设置点击监听器。 (我还没有找到关于此功能的官方文档,但我相信它只是滞后于代码发布。)请参阅 此处 有关 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
    })

更新

引用的 id 在 2.0.0-beta2 中不是立即可用的,尽管它们在 2.0.0-beta1 和之前的版本中。 “发布”上面的代码以在布局后获取引用 ID。这样的事情会起作用。

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

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Referenced ids are not available here but become available post-layout.
        layout.post {
            group.setAllOnClickListener(object : View.OnClickListener {
                override fun onClick(v: View) {
                    val text = (v as Button).text
                    Toast.makeText(this@MainActivity, text, Toast.LENGTH_SHORT).show()
                }
            })
        }
    }
}

这应该适用于 2.0.0-beta2 之前的版本,因此您可以这样做而不必进行任何版本检查。

原文由 Cheticamp 发布,翻译遵循 CC BY-SA 4.0 许可协议

从多个视图监听点击事件的更好方法是在所有需要的视图之上添加一个透明视图作为容器。该视图必须位于您需要执行单击的所有视图的末尾(即顶部)。

示例容器视图:

 <View
   android:id="@+id/view_container"
   android:layout_width="0dp"
   android:layout_height="0dp"
   app:layout_constraintBottom_toBottomOf="@+id/view_bottom"
   app:layout_constraintEnd_toEndOf="@+id/end_view_guideline"
   app:layout_constraintStart_toStartOf="@+id/start_view_guideline"
   app:layout_constraintTop_toTopOf="parent"/>

上面的示例包含所有四个约束边界,我们可以添加一起收听的视图,因为它是一个视图,我们可以做任何我们想做的事情,比如涟漪效应。

原文由 Vitthalk 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题