ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BindingAdapter에서 margin 설정하기
    Android 2020. 9. 24. 14:26
    반응형

    리사이클러 뷰를 사용하다보면 아이템마다 다르게 margin값을 설정해야 할 때가 있다.

    그럴때 BindingAdapter를 사용하여 margin을 설정해줄 수 있다.

    data class TextData(
        override val marginStart: Int,
        override val marginEnd: Int,
        override val marginTop: Int,
        override val marginBottom: Int
    ) : BaseTextData
    

    margin만 설명을 하자면 Data 클래스에 아이템별로 margin 값을 담아놔준다.

    (text 나 size등을 설정 할때도 동일하다.)

    val Int.dp: Int
        get() {
            val metrics = Resources.getSystem().displayMetrics
            return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), metrics)
                .toInt()
        }

    Int로 저장했기때문에 dp로 변환 과정이 필요하다.

    확장 프로퍼티를 사용하여 Int에서 dp로 변환할 수 있게 해주자

    @BindingAdapter("bind:layoutMarginStart")
    fun View.layoutMarginStart(margin: Int) {
        if (margin != 0) {
            val layoutParams = this.layoutParams as ViewGroup.MarginLayoutParams
            layoutParams.marginStart = margin.dp
            this.layoutParams = layoutParams
        }
    
    }
    
    @BindingAdapter("bind:layoutMarginEnd")
    fun View.layoutMarginEnd(margin: Int) {
        if (margin != 0) {
            val layoutParams = this.layoutParams as ViewGroup.MarginLayoutParams
            layoutParams.marginEnd = margin.dp
            this.layoutParams = layoutParams
        }
    }
    
    @BindingAdapter("bind:layoutMarginTop")
    fun View.layoutMarginTop(margin: Int) {
        if (margin != 0) {
            val layoutParams = this.layoutParams as ViewGroup.MarginLayoutParams
            layoutParams.topMargin = margin.dp
            this.layoutParams = layoutParams
        }
    
    }
    
    @BindingAdapter("bind:layoutMarginBottom")
    fun View.layoutMarginBottom(margin: Int) {
        if (margin != 0)
            {
                val layoutParams = this.layoutParams as ViewGroup.MarginLayoutParams
                layoutParams.bottomMargin = margin.dp
                this.layoutParams = layoutParams
            }
    }

    그런 다음 BindingAdapter에 위치에 따른 margin을 구현해준다.

    위에 코드 같은경우는 margin 기본값을 0으로 설정해뒀기 때문에 if문을 사용해서 제외시켜줬다.

    bind:layoutMarginStart="@{item.marginStart}"
                bind:layoutMarginEnd="@{item.marginEnd}"
                bind:layoutMarginTop="@{item.marginTop}"
                bind:layoutMarginBottom="@{item.marginBottom}"

    그런 다음 원하는 View에다가 item에 담긴 margin값을 넣어주면된다.

    반응형

    'Android' 카테고리의 다른 글

    [Android] 카카오 로그인 v2 API with kotlin - 1  (0) 2020.10.16
    Fragment 통신 (setTargetFragment, Listener)  (0) 2020.10.07
    [Android] Task  (0) 2020.09.02
    Koin 입문기  (0) 2020.09.02
    Dialog Fragment round corners  (0) 2020.09.02

    댓글

Designed by Tistory.