ConstraintLayout 동적 뷰 할당
회사에서 프로젝트 추가 개발에 들어갔다.
커스텀 뷰를 동적으로 할당해야하는 상황이 있었는데 레이아웃이 ConstraintLayout이였다.
동적으로 뷰를 추가할 때는 LinearLayout을 주로 쓴다는 것을 알았지만 이번에는 ConstraintLayout에 동적으로 뷰를 추가해보려고 도전해봤다.
한 번 해봤지만 이번이 마지막일 것 같다. ㅋㅋ
LinearLayout에 뷰를 추가하는 것보다 복잡해서 굳이 다시하고싶지가 않다.
참고한 StackOverFlow 링크는 아래와 같다.
모든 코드를 자세히 적기는 힘들고 큰 틀에서 작업 순서만 확인하길 바란다.
val constraintSet = ConstraintSet() //1
imageSlider = GolfLandImageSlider(context, adImgCount = imgList.length()) //2
imageSlider.id = View.generateViewId() //3
imageSlider.layoutParams = //4
ViewGroup.LayoutParams(ConstraintLayout.LayoutParams.MATCH_CONSTRAINT,
ConstraintLayout.LayoutParams.MATCH_CONSTRAINT)
constLayout.addView(imageSlider) //5
constraintSet.clone(constLayout) //6
constraintSet.connect(imageSlider.id, ConstraintSet.TOP, R.id.guideLine, ConstraintSet.BOTTOM) //7
constraintSet.connect(imageSlider.id, ConstraintSet.BOTTOM, R.id.moreBtn, ConstraintSet.TOP)
constraintSet.connect(imageSlider.id, ConstraintSet.START, R.id.const_layout, ConstraintSet.START)
constraintSet.connect(imageSlider.id, ConstraintSet.END, R.id.const_layout, ConstraintSet.END)
constraintSet.applyTo(constLayout) //8
1 => ConstraintSet 객체 만들기
2 => 커스텀 뷰 객체 만들기
3 => 커스텀 뷰 id 할당
4 => 커스텀 뷰 layoutParams 할당
이때, ConstraintLayout.LayoutParams.MATCH_CONSTRAINT가 0dp를 말한다. ㅎ
5 => constLayout(커스텀 뷰를 할당할 ConstraintLayout)에 커스텀 뷰를 추가한다.
6 => constLayout(커스텀 뷰를 할당할 ConstraintLayout)의 제약조건을 constraintSet에 clone한다.
7 => constraintSet에 커스텀뷰의 제약조건을 설정한다.
ConstraintSet.connect(주체가 될 뷰 id, 주체가 될 뷰의 방향, 제약조건의 대상 뷰 id, 제약조건의 대상 뷰의 방향)
예를 들어,
constraintSet.connect(imageSlider.id, ConstraintSet.TOP, R.id.guideLine, ConstraintSet.BOTTOM)
|| 같은 뜻
app:layout_constraintTop_toBottomOf="@id/guideLine"
8 => 설정한 제약조건을 constLayout(ConstraintLayout)에 적용한다.
위에 첨부한 스택오버플로우 링크를 읽어보니까 ConstraintLayout에 뷰를 할당할 때는 순서가 되게 중요하다고한다.
일단, 모든 childView를 ConstraintLayout에 addView하고나서 ConstraintSet을 clone해야한다.