2017-10-14 2399 views
4

基本上我想将一个OnClickListener附加到ConstraintLayout中的多个视图中。在ConstraintLayout中使用组来侦听多个视图上的点击事件

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

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

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

然而,这似乎并不为的ConstraintLayout版本1.1.0-beta2

难道我做错了什么工作,有没有办法实现这种行为,或是否需要监听连接到每个单一视图?

回答

9

Group in ConstraintLayout只是意见AFAIK的松散关联。它不是ViewGroup,所以当视图位于ViewGroup时,您将无法使用单击监听器。

作为替代方案,您可以在代码中获得属于您的Group成员的ID列表,并明确设置点击侦听器。多发于

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. 
      } 
     }); 
    } 

由于这可能是一个功能,它可能是有用的:(我还没有找到官方文档此功能,但我认为这只是滞后的代码版本。)

的Java Kotlin你可以为它建立一个扩展功能。

科特林:

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

    ... 

    // then call the function on the group 
    group.addOnClickListener(listener) 
1

的更好的方式来听取多个视图点击是添加一个透明视图上的所有需要​​的视图顶部的容器听在一起。 请确保,此容器视图必须在需要一起听的所有视图的末尾。

样品容器视图:

   <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" 
      /> 

以上样品中含有内的所有四个约束边界,我们可以添加意见说来听听在一起,因为它是一个视图,我们可以做任何我们想做的,如波纹影响。

+0

或者你可以把它放在底部,如果你想改变背景 –

0

虽然我喜欢Vitthalk's answer中的一般方法,但我认为它有一个主要缺点和两个小问题。

  1. 它不考虑的单一视图的动态位置的变化

  2. 它可以用于视图不属于组的一部分注册点击

  3. 它不是一种通用的解决方案,以这种相当常见问题

虽然我不确定第二点的解决方案,但第一个和第三个显然很容易。组

在元件的


1.会计位置的变化这实际上是相当简单的。可以使用约束布局的工具集来调整透明视图的边缘。 我们只需使用Barriers即可接收组中任何视图的最左边,最右边等位置。 然后我们可以调整透明视图到障碍而不是具体视图。

3.通用溶液

使用科特林我们可以扩展组级到包括如上所述的,增加了一个ClickListener到视图的方法。 此方法只是简单地将障碍添加到关注组的每个孩子的布局中,透明视图与障碍对齐并将ClickListener注册到后者。

这样我们只需调用组上的方法,而不需要每次我们需要这种行为时手动添加视图到布局。