Databinding์ด๋!(๋ฐ์ดํฐ ๋ฌถ๊ธฐ?)
→ ์๋๋ก์ด๋์์์ data binding ์ด๋, Android Archictecture Components ์ ํ ๋ถ๋ถ์ผ๋ก์
Ui ์์์ ๋ฐ์ดํฐ๋ฅผ ํ๋ก๊ทธ๋จ์ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐํ์ง ์๊ณ , ์ ์ธ์ ํ์์ผ๋ก ๊ฒฐํฉํ ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งํ๋ค.
์ฝ๊ฒ ์ค๋ช ํ๋ฉด MVVMํจํด์ ์ฌ์ฉํ๋ฉด์ Activity๋ Fragment์์ ๋ทฐ ๊ด๋ จ๋ ์ฝ๋๋ค์ ์ฌ์ฉํ์ง ์๊ณ xml ์ฝ๋์ ์ง์ด ๋ฃ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์ด๊ฒ๋ค์ ViewModel์์ ๊ด๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
๋ ๋ ๋ ํผ๋ถ์ ์๋ฟ๊ฒ ๋งํ์๋ฉด Activity๋ Fragment์์ ๋ง์ ์ฝ๋๋ค์ ์ ์ง ์๊ฒ ํจ์ผ๋ก์จ ๋ทฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ณํ์ํค๋ ์ฝ๋๋ ViewModel์์ ๊ด๋ฆฌํด์ Activity & Fragment ๋ค์ ์ฝ๋๋ ๋์ฑ ๊ฐ๋จํ๊ฒ ๋ง๋ค๋ฉฐ ๋ถ๋ฆฌ๋ฅผ ์ ๋๋ก ์์ผ์ค ์ ์์ต๋๋ค.
๐ต ๊ตณ์ด ์ ๋ถ๋ฆฌ๋ฅผ ํด์ผ๋๋์?
→ ๋ผ๊ณ ๋งํ ์ ์๋๋ฐ ์ง๊ธ ๊ฐ๋จํ ์ฑ์ ๋ง๋ค๋ฉด ์๊ด์์ง๋ง ๋์ค์ ๊ธฐ๋ฅ์ด ๋ง์์ง๊ณ ์ฒ๋ฆฌํด์ผํ ๋ฐ์ดํฐ๋ค์ด ๋ง์์ง๋ฉด ๊ด๋ จ๋ ์ฝ๋๋ฅผ ์ฐพ๋๋ฐ ์๋ชจ๋๋ ์๊ฐ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ผ์ ํจ์จ์ ๋๋ฆฌ๊ณ ์ ์ง & ๋ณด์๋ฅผ ๋์ฑ ํธ๋ฆฌํ๊ฒ ํ๊ธฐ ์ํจ์ ๋๋ค.
๐ค ๊ฐ๋จํ ์๋ฅผ ๋ค์ด ์ค๋ช ์ ํด๋ณด๊ฒ ์ต๋๋ค!
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
โ
<TextView
android:id="@+id/sample_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
โ
</androidx.constraintlayout.widget.ConstraintLayout>
๋ณดํต TextView์ ํ ์คํธ๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด์ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ผ์ ๊ฒ์ด์ฃ .
// java
TextView textView = findViewById(R.id.sample_text);
textView.setText("์ ์ด์ฝฅ");
โ
// kotlin
sample_text.setText("์ฌ๋ผํ");
ํ์ง๋ง data binding์ ์ด๋ค๋ฉด
<TextView
android:text="@{viewmodel.userName}" />
์ด์ ๊ฐ์ด ์ค์ ํ๋ฉด xml์์ ์ง์ ๋ณ๊ฒฝ ์ํฌ ์ ์์ต๋๋ค.
๋ฌผ๋ก ๊ทธ๋ฅ ์ ๋ ๊ฒ ์ฐ๋ฉด ์๋ฌ๊ฐ ๋์ ํ์ํ ๋ถ๋ถ์ด ์์ต๋๋ค.
์์ ์๋ xml ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝ ํด์ฃผ๊ณ ViewModel์ ํธ์ถํด์ผํ์ฃ
์๋๋ฅผ ๋ณด์์ฃ
//////////////////////////////////////////////////////////////////////////
// xml ์ฝ๋์์ Alert + Enter๋ฅผ ๋๋ฅด๋ฉด ///
// convert to data binding layout์ด ๋์ค๋๋ฐ, ๋๋ฅด๋ฉด ์๋์ผ๋ก layout์ผ๋ก ๋ฌถ์ธ๋ค. ///
//////////////////////////////////////////////////////////////////////////
<?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.example.project.ExampleViewModel" />
</data>
โ
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".view.workCondition.WorkConditionCarFragment">
โ
<TextView
android:text="@{viewmodel.userName}" />
// ๋ ์ด์์ ๋ด์ ํํ์์ "@{}" ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ฑ(attribute properties) ์์ ์์ฑ๋๋ค.
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
์ด๊ฒ๋ง์ด ๋์ด ์๋๋๋ค.๐ต(์ ๋ ๊ท์ฐฎ์์ง๋ ๊ธฐ๋ถ์ด ๋๋ ๊ฑด ์์ผ๊น?….)
ํด๋น xml์ ์ฌ์ฉํ๋ Activity๋ Fragment์์ binding์ ํธ์ถํ๊ณ ViewModel์ ์ฃผ์ ํด์ค์ผํฉ๋๋ค.
class ExampleFragment : Fragment() {
private lateinit var binding: FragmentExampleBinding
// ์์กด์ฑ์ ์ฃผ์
ํ viewmodel์
๋๋ค. -> koin
private val viewModel: WorkConditionViewModel by viewModel()
โ
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentExampleBinding.inflate(inflater,container,false).apply {
lifecycleOwner = this@ExampleFragment // ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ด Fragment์ ์ผ์น์ํค๊ฒ ๋ค.
executePendingBindings()
}
return binding.root
}
โ
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.run {
this.viewModel = viewModel
}
}
}
โ
// ExampleViewModel.kt
class ExampleViewModel: ViewModel() {
...
val userName = MutableLiveData("์ ์ด์ฝฅ")
...
}
Data Binding์ ํ๋ก์ ํธ์ ๋์ ํ๋ฉด์ ๋๊ผ๋ ์ ์
์ฅ์
- Activity์ Fragment์์ ์ฌ์ฉํ๋ ์ฝ๋์ ์ค์ด 90ํ๋ก๊ฐ ์ฌ๋ผ์ก๋ค.
- ๋ถ๋ฆฌ๊ฐ ์ ๋์ด์์ด ์ ์ง ๋ณด์๊ฐ ์ฉ์ดํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ ์งํด์ผํ๋ ๋ถ๋ถ์์ ๋ค์ ์ฌ์ค์ ํด์ฃผ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ์ง ์์๋ ๋๋ค.
๋ฑ๋ฑ ๋ง์ ์ฅ์ ๋ค์ด ์์ต๋๋ค.
๋จ์ ๋ํ ์๊ฒ ์ง์ฉ?
๋จ์
- ViewPager๋ RecyclerView์์ ์ฌ์ฉํ๋ ์ฝ๋๋ค๋ xml ์์ผ๋ก ๋ฃ์ด์ผํ๋๋ฐ ๋ฐ๋ก ์ค์ ์ ํด์ค์ผํ๋ ๋ถ๋ถ๋ค์ด ๋ง๊ธฐ์ Binding Adapter๋ผ๋ ๊ธฐ์ ๋ ์ฌ์ฉํด์ผํ๋ค.
- ๊ฐ๋ณ๊ฒ if ๋ฌธ์ ์ฌ์ฉํ๊ณ ์ถ์๋ฐ ์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
- ๊ฐ๋ฐ ์๋๊ฐ ๊ธฐ์กด๋ณด๋ค ์กฐ๊ธ ๋ ๊ฑธ๋ฆฐ๋ค(์์ง ์ต์ํ์ง ์๊ธฐ ๋๋ฌธ์,,, ๋ค์์ ๋ฐ๋์ง๋?)
๋ฑ๋ฑ ์์ง๋ง ๊ณ์ ๊ฐ๋ฐ์ ํด๋ณด๋ฉด์ ์ฅ์ ์ด ๋ ๋ง์ ๊ฒ์ผ๋ก ๋๊ปด์ง๊ณ ์๋ค.
๋์ค์ Compose๋ฅผ ๋์ ํ๋ฉด ์ด ๊ธฐ๋ฅ๋ ๋ง์ด ์ฌ์ฉ์ด ๋์ง ์๊ฒ ์ง๋ง ์์ง๊น์ง Compose๋ฅผ ์ ๋๋ก ์ ์ฉํ๊ธฐ ์ ๊น์ง๋ ์ด ๊ธฐ๋ฅ์ ๋ง์ด ์ฌ์ฉํ ๊ฒ ๊ฐ๋ค. (์ด๋ฒ๋ ๋ ์์๋ Compose ๊ฐ๋ฐ ๋ธ๋ก๊ทธ๋ฅผ ์ธ ์์ ๐ค)
๋ค์ ํธ์ ์ฌ์ฉํ๋ฉด์ ๊ฒช์๋ ์๋ฌโ๋ RecyclerView ๐, ViewPager, Image๐ ๊ด๋ จํด์ ์ด๋ป๊ฒ ์์ ํ ์ ์๋์ง ์ ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'Development > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Databinding ์์ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ค์ ๊ฐ๊ณตํ ๊น? ๐ฝ (1) | 2022.09.18 |
---|---|
๐ฆย Databinding์ ์ฐ๋ฉด์ - 2 (0) | 2022.09.08 |
์์กด์ฑ ์ฃผ์ ์ Koin๐ชย ๋ ๋ข์ - 2 (0) | 2022.09.08 |
์์กด์ฑ ์ฃผ์ ์ Koin๐ช ํ ๋ข์ - 1 (0) | 2022.09.08 |
Event Bus๐์ ๋ฒ์ค ์ข ๋ฐ์๋ณผ๊น? (0) | 2022.09.04 |