데이터 바인딩을 사용할 때 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" />