2017-10-14 13 views
4

기본적으로 하나의 OnClickListener를 ConstraintLayout 내의 여러보기에 첨부하고 싶습니다.ConstraintLayout의 그룹을 사용하여 여러보기에서 클릭 이벤트 수신 대기

ConstraintLayout으로 마이그레이션하기 전에 하나의 레이아웃 안에 리스너를 추가 할 수있는 뷰가 있습니다. 이제 그들은 ConstraintLayout 바로 아래의 다른 뷰와 같은 레이어에 있습니다.

android.support.constraint.Group에보기를 추가하고 프로그래밍 방식으로 OnClickListener를 추가했습니다.

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

그러나이

내가 뭔가 잘못 적이 1.1.0-beta2 ConstraintLayout 버전으로 작동하지 않는 것,이 동작을 달성하는 방법은 무엇입니까 또는 나는 각각에 수신기를 연결해야 할 단일보기?

답변

9

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

유용 할 수있는 기능이 될 수도 있습니다 더 자주의 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을 사용하십시오. 그런 다음 투명한 뷰를 콘크리트 뷰 대신 장벽으로 조정할 수 있습니다. 우리는 상술 한 바와 같이, 뷰 상에 ClickListener를 추가하는 방법을 포함하는 그룹 클래스를 확장 할 수있는 코 틀린 사용

3. 일반 용액

. 이 메서드는 단순히 그룹의 모든 자식에주의를 기울여 레이아웃에 장벽을 추가하고 장벽에 정렬 된 투명 뷰를 추가하고 ClickListener를 후자에 등록합니다.

이 방법을 사용하면 그룹의 메서드를 호출하면되므로이 동작이 필요할 때마다 수동으로 레이아웃에 뷰를 추가 할 필요가 없습니다.