๐ก ์ฐ์ํํ ํฌ์ฝ์ค๋ฅผ ์งํํ๋ฉด์ DataBinding์์ BindingAdapter๋ฅผ ํ์ฉํ ๊ฒฝํ์ ๊ธฐ๋กํ์์ต๋๋ค!
BindingAdapter
- Android์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ๊ธฐ๋ฅ์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก, XML ๋ ์ด์์์์ ์ฌ์ฉ์ ์ ์ ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ทฐ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ๊ธฐ์กด์ ์ ๊ณต๋์ง ์๋ ์์ฑ์ XML์์ ์ง์ ์ค์ ํ ์ ์๊ณ , ๋ทฐ์ ๋ก์ง๊ณผ UI ์ค์ ์ ๋ณด๋ค ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
๋ฐ์ธ๋ฉ ์ด๋ํฐ | Android Developers
BindingAdapter ์ฌ์ฉ
ํ๋ก์ ํธ ์ธํ
- build.gradle ํ์ผ์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํ์ฑํํด์ผ ํฉ๋๋ค.
android {
...
viewBinding {
enabled = true
}
dataBinding {
enabled = true
}
}
ImageUrl ์์ฑ ์ค์
- BindingAdapter๋ฅผ ์ฌ์ฉํ์ฌ imageUrl ์์ฑ์ ์ฒ๋ฆฌํ ๋ฉ์๋๋ฅผ ์์ฑํฉ๋๋ค.
- ์ด ๋ฉ์๋๋ฅผ ํตํด์ ImageView์ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ์์ ์ ๋ด๋นํฉ๋๋ค.
import android.widget.ImageView
import androidx.databinding.BindingAdapter
import com.bumptech.glide.Glide
@BindingAdapter("imageUrl")
fun loadImage(view: ImageView, url: String?) {
url?.let {
Glide.with(view.context)
.load(it)
.into(view)
}
}
๋ฐ์ธ๋ฉ์ด๋ํฐ ํ์ฉ
- ์ ์ธํ ๋ฐ์ธ๋ฉ์ด๋ํฐ๋ฅผ XML ๋ ์ด์์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค!
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="imageUrl"
type="String" />
</data>
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:imageUrl="@{imageUrl}" />
</layout>
- ์ธ์๋ฅผ ์๋ชป ์ ๋ฌํ ๊ฒฝ์ฐ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ ์ ์์ผ๋ ์กฐ์ฌํด์ผ ํฉ๋๋ค.
์กํฐ๋นํฐ ๋๋ ํ๋๊ทธ๋จผํธ
- ์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ์์๋ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํตํด imageUrl ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// ์์์ ์ด๋ฏธ์ง URL
binding.imageUrl = "<https://example.com/sample.jpg>"
}
}
๋ถ๊ธฐ์ฒ๋ฆฌ์ ํ์ฉ
- ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํ์ฉํ๋ฉด XML์์ ๋ณต์กํ ๋ถ๊ธฐ์ฒ๋ฆฌ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ๋ฐ์ธ๋ฉ ์ด๋ํฐ์์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, String์ด๋ ์์์ ์ง์ ํ ์ ์์ต๋๋ค.
@BindingAdapter("detailViewTypeText")
fun TextView.bindDetailViewTypeText(clubDetailViewType: ClubDetailViewType?) {
clubDetailViewType ?: return
val text =
when (clubDetailViewType) {
ClubDetailViewType.RECRUITMENT -> context.getString(R.string.club_detail_participate_text)
ClubDetailViewType.END_RECRUITMENT -> context.getString(R.string.club_detail_un_participate_text)
ClubDetailViewType.MINE, ClubDetailViewType.PARTICIPATED -> context.getString(R.string.club_detail_mine_text)
}
this.text = text
}
์ ๋ฆฌ
- BindingAdapter๋ฅผ ์ฌ์ฉํด ๋ทฐ์ ์์ฑ์ ํ์ฅํ๊ณ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๊ณผ ํจ๊ป ๋ทฐ์ ๋ฐ์ดํฐ์ ๊ฒฐํฉ์ ๋์ฑ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์์ผ๋ฉฐ, UI์ ๋ก์ง์ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.