BindingAdapter
BindingAdapter는 적절한 프레임워크를 호출하여 값을 설정하는 작업을 담당합니다.
액티비티 또는 레이아웃에서 원하는 속성이 없어 해당 기능을 처리할 수 없을 때 BindingAdapter을 사용하여 View의 속성 값을 커스터마이징할 수 있습니다.
BindingAdapter 생성
BindingAdapter는 Java의 static 함수로 되어 있기 때문에 @JvmStatic 어노테이션을 붙여줘야 합니다.
확장 함수를 사용하면 @JvmStatic 어노테이션을 붙이지 않아도 되고, object로 감싸지 않아도 됩니다.
@BindingAdapter에서 value는 XML에서 사용하고 싶은 속성을 의미합니다.
다음은 Glide 라이브러리를 사용하여 ImageView에 이미지 URL을 연결시켜주는 BindingAdpater입니다.
object ImageBindingAdapter {
@JvmStatic
@BindingAdapter(value = ["imageUrl", "errorImage"])
fun setImageUrl(imageView: ImageView, imageUrl: String, errorImage: Drawable) {
Glide.with(imageView.context)
.load(imageUrl)
.error(errorImage)
.into(imageView)
}
}
// 코틀린 확장 함수 사용
@BindingAdapter(value = ["imageUrl", "errorImage"])
fun ImageView.setImageUrl(imageUrl: String, errorImage: Drawable) {
Glide.with(imageView.context)
.load(imageUrl)
.error(errorImage)
.into(this)
}
XML에 적용
imageUrl 속성의 값에 따라 ImageView의 이미지가 바뀌도록 BindingAdpater를 설정합니다.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="item"
type="com.example.databinding.model.Item" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/myImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:imageUrl="@{item.imageUrl}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Activity에 적용
item 객체에 무엇이 들어가느냐에 따라 ImageView의 이미지가 변경됩니다.
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.item = ...
}
}
728x90
반응형
'안드로이드 > 활용' 카테고리의 다른 글
[Android] CountDownTimer 사용하기 (0) | 2023.10.11 |
---|---|
[Android] SMS Retriever API를 통해 SMS 자동으로 읽어오기 (0) | 2023.10.11 |
[Android] ML Kit를 사용하여 얼굴 인식 (0) | 2023.10.07 |
[Android] CameraX 사용하기 (0) | 2023.10.06 |
[Android] ExoPlayer 사용하기 (0) | 2023.10.05 |