📱 Android

[Android] DataBinding BindingAdapter 사용하기

콩드로이드 2023. 7. 27. 21:10

데이터 바인딩을 사용할 때  view의 attributes를 커스텀으로 추가해 사용할 때 

즉, 쉽게 말하자면 xml에서 원하는 속성을 만들어서 사용하는 방식입니다 

어떤 속성을 만드는지에 따라서 무궁무진하게 사용됩니다 :) 

 


 

기본 형태 

@BindingAdapter("xml에서 사용할 명칭")
fun setAB(속성과 연결된 뷰 타입, T) {
 // ...
}

 

실제 코드를 보자면 

ImageView에 적용하는 예시니,

첫번째 param은 ImageView이고 함수 안에서 사용될 데이터는 String 값임을 알 수 있습니다

@BindingAdapter("setImgUrl")
fun setImgUrl(view: ImageView, url: String) {
    Glide.with(view).load(url).into(view)
}

 

xml

- data 태그에서 variable을 설정해줍니다 

 

- ImagView에서 아까 설정해둔 명칭인 setImgUrl이 뜨는 걸 알 수 있습니다 

💡 BindingAdapter에 값 설정 시 반드시 "@{값}"을 사용해야 unKnown attribute 에러를 방지할 수 있습니다 

 


만약 여러개의 type을 받는 BindingAdapter를 만들고 싶다면? 

isVisible인 ImageView에만 이미지를 설정하는 예를 들어보겠씁니당

 

기본 형태 

@BindingAdapter("xml에서 사용할 명칭", "xml에서 사용할 명칭2")
fun setTwoAttribute(속성과 연결된 뷰 타입, T1, T2) {
 // ...
}

 

예시 소스를 보자면, 아래와 같습니다 

@BindingAdapter("setImgUrl", "setImgVisible")
fun setVisibleImgUrl(view: ImageView, url: String, isVisible: Boolean) {
    if (isVisible)
        Glide.with(view).load(url).into(view)
}

 

 

xml

위의 예제와 동일하되, 각각 지정해둔 명칭 1, 2로 각각 속성이 생기는 걸 볼 수 있습니다

 <data>
        <variable
            name="url"
            type="String" />

        <variable
            name="isVisible"
            type="Boolean" />
</data>


 <ImageView
            setImgUrl="@{url}"
            setImgVisible="@{isVisible}"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:alpha="0.8"
            android:contentDescription="@null"
            android:scaleType="fitXY"
            android:src="@drawable/intro" />