header-img
Info :

๋ฉด์ ‘๊ธฐ๋ก์šฉ Data Binding ์ •๋ฆฌ

 

Data Binding์€ xml ํŒŒ์ผ์— data๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์œผ๋กœ MVVM ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ๋•Œ LiveData์™€ ํ•จ๊ป˜ ๊ฑฐ์˜ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋จ. ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์˜ ์žฅ์ ์€ ๊ธ€๋ฃจ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ. ๋ ˆ์ด์•„์›ƒ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋“ค์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ.

 

๋‚ด๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ ๋ถ€๋ถ„

<?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="viewModel"
            type="com.shootit.greme.viewmodel.MainViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ui.view.MainActivity">

        // ...

        <TextView
            android:id="@+id/tvPageName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@style/BoldText"
            android:text="@{viewModel.currentPage.text}"
						// ...
            />

        // ...

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

์ „์ฒด๋ฅผ <layout> ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ฃผ๊ณ  <data> </data> ํƒœ๊ทธ ์‚ฌ์ด์— <variable> ํƒœ๊ทธ๋กœ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์คŒ. ๋‚˜๋Š” viewmodel์„ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด์–ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์คŒ.

class MainActivity : BaseActivity<ActivityMainBinding>(R.layout.activity_main) {
    override val viewModel by viewModels<MainViewModel> {
        MainViewModel.MainViewModelFactory(/* ํ•„์š”ํ•œ ์ •๋ณด */)
    }

    override fun initViewModel(viewModel: ViewModel) {
        binding.lifecycleOwner = this@MainActivity
        binding.viewModel = this.viewModel
    }
	
		// ...
}

๊ทธ๋ฆฌ๊ณ  main activity ํด๋ž˜์Šค์—์„œ ๋ทฐ๋ชจ๋ธ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์ด๋ฅผ xml ์ƒ์—์„œ ์„ ์–ธํ–ˆ๋˜ variable์ธ viewmodel์— ๋„ฃ์–ด์คŒ.

class MainViewModel(private val tmp: String): ViewModel() {
    // ... 
    var currentPage = MutableLiveData<MainFragmentEnum>(MainFragmentEnum.HomeFragment)
}

ViewModel ํด๋ž˜์Šค์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•จ. currentPage ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค XML ์ƒ์—์„œ๋„ ๋ฐ˜์˜์ด ๋จ.

XML์—์„œ ์šฉ๋ฒ•

๊ฐ’ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ

android:text="@{๋ณ€์ˆ˜๋ช…}"

๊ธฐ๋ณธ ๊ฐ’ ์„ค์ •

android:text="@{๋ณ€์ˆ˜๋ช…, default=๊ธฐ๋ณธ๊ฐ’}"

ํ•จ์ˆ˜ ์„ค์ •

android:onClick="@{() -> vm.ํ•จ์ˆ˜๋ช…()}"

์กฐ๊ฑด๋ฌธ ์‚ฌ์šฉ

// ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
android:text="@{String.valueOf(๋ณ€์ˆ˜ == null ? 0 : 1)}"

 

Binding Adapter

์•ˆ ์ผ์Œ.

https://todaycode.tistory.com/53

 

Reference

https://velog.io/@jojo_devstory/Android-Databinding์„-์•Œ์•„๋ณด์ž

https://velog.io/@changhee09/์•ˆ๋“œ๋กœ์ด๋“œ-Data-Binding

https://show-me-the-money.tistory.com/entry/Android-Data-Binding-๊ธฐ๋ณธ-ํ™œ์šฉ๋ฒ•-์ด์ •๋ฆฌ

๋”๋ณด๊ธฐ
CS/Android, Kotlin