2017-10-14 8 views
4

基本的には、ConstraintLayout内の複数のビューに1つのOnClickListenerをアタッチしたいと思います。ConstraintLayoutのグループを使用して複数のビューのクリックイベントをリスンする

ConstraintLayoutに移行する前に、リスナーを追加できるレイアウト内のビュー。今はConstraintLayoutのすぐ下の他のビューと同じレイヤーにあります。

私はandroid.support.constraint.Groupにビューを追加して、プログラムでそれにOnClickListenerを追加しようとしました。

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

しかしこれは、私はこの動作を達成するためにそこの方法であるか、私はそれぞれにリスナーを添付する必要がありますか、何か間違ったことを行っているConstraintLayoutバージョン1.1.0-beta2

のように動作していないようです単一のビュー?

答えて

9

ConstraintLayoutGroupは、AFAIKのビューの緩やかな関連付けです。 ViewGroupではないため、ビューがViewGroupの場合と同様に1回のクリックリスナを使用することはできません。

代わりに、コード内にGroupのメンバーであるIDのリストを取得して、クリックリスナーを明示的に設定することができます。 (私はこの機能を公式ドキュメントを見つけていないが、私はそれだけで、コードのリリースを遅れていると信じています。)

のJava:このよう

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

サンプル以上が、その内4つのすべての制約境界が含まれている、私たちは一緒に聴くためのビューを追加することができ、それが表示されるように、我々は、このようなリップルとして、私たちがやりたいことができます効果。

+0

、または背景を変更したい場合は下に置くことができます –

0

私はVitthalk's answerに一般的なアプローチが好きですが、1つの大きな欠点と2つの小さな問題があると思います。

  1. それはそれはむしろこれを一般的な解決策ではないグループ

  2. の一部ではないビューのクリックを登録することができる単一のビュー

  3. の動的な位置変化を考慮していません共通の問題

2番目の点の解決策についてはわかりませんが、最初と3番目の点ではかなり簡単です。グループ内の要素の


1.会計位置変化

これは実際にはかなり単純です。制約レイアウトのツールセットを使用して、透明なビューのエッジを調整することができます。 グループ内の任意のビューの左端、右端などの位置を受け取るには、単にBarriersを使用します。 次に、具体的なビューの代わりに透明なビューをバリアに調整することができます。 Kotlinを使用して

3.一般的なソリューション

我々は、上記のような表示にClickListenerを追加する方法を含め、グループクラスを拡張することができます。 このメソッドは、グループのすべての子に注意を払ってレイアウトにバリアを追加するだけで、バリアに合わせた透明なビューを作成し、ClickListenerを後者に登録します。

このようにして、このメソッドをグループで呼び出すだけで、この動作が必要になるたびにレイアウトに手動でビューを追加する必要はありません。

関連する問題