๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ๊ณต๋ถํ๋ค๋ฉด, Jetpack๊ณผ AAC๋ฅผ ๋ค์ด๋ณธ ์ ์์ ๊ฒ์ด๋ค.
Jetpack์ 2018๋
๊ตฌ๊ธ IOํ์ฌ์์ ๋ฐํ๋ ์๋๋ก์ด๋ ์ฑ ๊ฐ๋ฐ ํจํค์ง ๋ฌถ์ ์
๋๋ค.
Databinding์ JetPack์ ๊ตฌ์ฑ ์์ ์ค ์ํคํ
์ฒ์ ๊ด๋ จ๋ AAC๋ถ๋ถ์ ์ํ๋ค.
์ด๋ฆ ๊ทธ๋๋ก ๋ทฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ด์ฃผ๋ ์ญํ ์ ํ๋ AAC ๊ธฐ๋ฒ์ ํ๋.
๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
์ ์ ๋ฆฌํ์.
Reference : https://developer.android.com/topic/libraries/data-binding
The Data Binding Library is a support library that allows you to bind UI components in your layouts to data sources in your app using a declarative format rather than programmatically.
Google์์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ๋ํด ์์ ๊ฐ์ด ์ค๋ช
ํ์๋ค.
๋ฐ์ดํฐ๋ฐ์ธ๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ด ์๋ ์ ์ธ์ ์ธ ํ์์ ์ฌ์ฉํ์ฌ ๋ ์ด์์์ UI ๊ตฌ์ฑ์์์ ์ฑ์ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ฐ์ธ๋ฉ ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๋ ์ด์์์ ์ข ์ข UI ํ๋ ์์ํฌ ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฆฌ์ฐ๋ ์กํฐ๋นํฐ๋ด์์ ์ ์๋๊ธฐ๋ํ๋ค.
findViewById()๋ฅผ ์ด์ฉํ์ฌ UI ๊ตฌ์ฑ์์์ธ Textview๋ฅผ ์ฐพ๊ณ viewmodel๋ณ์์ ์์ฑ์ธ userName์ ๋ฐ๋ก ๋ฐ์ธ๋ฉ ์ํจ๋ค.
findViewById<TextView>(R.id.sample_text).apply {
text = viewModel.userName
}
๋ฐ์ดํฐ๋ฐ์ธ๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ Layout file์ ์ง์ ์์ ฏ์ text๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋ค.
์ด ๋ฐฉ๋ฒ์ ์์์ ๋ณธ ์ฝ๋๋ฅผ ์์จ ์ ์๋ค.
๋์ , @{}
๐๐ป ์ด๋ฌํ syntax๋ฅผ ์ฌ์ฉํ์ฌ ๋ํ๋ผ ์ ์๋ค.
<TextView
android:text="@{viewmodel.userName}" />
๊ตฌ๊ธ ๊ณต์ ์ฌ์ดํธ์ ๋์์๋ ๊ฒ ์ฒ๋ผ, ๋จ์ํ findViewById()๋ฅผ ๋์ฒดํ๊ธฐ ์ํ ๋ชฉ์ ์ด๋ผ๋ฉด dataBinding๋ณด๋จ ViewBinding์ ๊ถํ๊ณ ์๋ค.
(๋ทฐ๋ฐ์ธ๋ฉ์ด ๋์จ ๋ชฉ์ ์ด ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ค์ด ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ findViewById()๋์ฒด ์๋จ์ผ๋ก ์ฌ์ฉํ๊ณ ์๊ธฐ์ ๋์๋ค๊ณ ํ์๋ค.)
ํน์, ViewBinding๊ณผ DataBinding์ ์ฐจ์ด๊ฐ ๊ถ๊ธํ๋ค๋ฉด
๋ค์์ ํฌ์คํธ๋ฅผ ๋ณด์. ๐๐ป ViewBinding VS DataBinding์ด์ผ๊ธฐ
์ฌ์ฉ์ ์์, ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ทธ๋ ๋ฏ ์ธํ
์ ํด์ผํ ๊ฒ์ด๋ค.
build.gradleํ์ผ์
android{
.
.
.
dataBinding{
enabled = true
}
}
์ด๋ ๊ฒ ํ ์ค ์ถ๊ฐํด์ฃผ์.
๐ ํน์.. gradle๋ฒ์ ์ด
classpath "com.android.tools.build:gradle:4.1.0"
์ด๋ ๊ฒ 3.6๋ฒ์ ์ ๋์ด๊ฐ๋ค๋ฉด
android{
.
.
.
buildFeatures {
dataBinding = true
}
}
์ด๋ฐ ์์ผ๋ก ์ถ๊ฐํด์ค์ผ ํ ๊ฒ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก xml file์ ์ด์ด๋ณด๋ฉด
<ConstraintLayout...
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- UI layout's root element -->
<ConstraintLayout/>
์ด๋ฐ์์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ ๊ฒ์ด๋ค.
๊ทธ๋ผ ๋ ์ด์์ ํ์ผ์ ๋ฃจํธ ํ๊ทธ์ Layout์ ์ถ๊ฐํด์ผ ํ๋ค.
์ถ๊ฐํ ์๋์ ์์๋ฅผ ๋ณด์.
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewmodel"
type="com.myapp.data.ViewModel" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewmodel.data}"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp" />
</android.support.constraint.ConstraintLayout>
</layout>
์์ ์์์์ data ํ๊ทธ๋ ๋ทฐ๋ชจ๋ธ์ ๊ฐ์ฒดํ ์์ผ์ ์ฌ์ฉํ ์ ์๊ฒํ๋ค.
'viewmodel'์ ๊ฐ์ฒด๋ช
์ผ๋ก ๋ํธ ์ฐ์ฐ์๋ฅผ ํตํด ํด๋์ค์ ๋ณ์๋ ๋ฉ์๋์ ์ ๊ทผ ํ ์ ์๋ค.
์์ ์์ ์์ viewmodel์ ์ ์ธ๋ data๊ฐ์ ๊ฐ์ ธ์์ tv_start์ ๋ฐ์ธ๋ฉ ์์ผ์ค๋ค.
ํด๋์ค ๊ฐ์ฒดํ๋ก ๋ ์ด์์์์ ์์ ฏ์ ์ค์ ๊ฐ์ ๋ณ๊ฒฝํจ์ผ๋ก์จ ์์ค์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ ๊ฒ์ด๋ค.
๋ ์ด์์์ ๋ฃจํธ ํ๊ทธ๋ฅผ ์ด์ฉํด์ ๋ณ๊ฒฝํ๋ฉด ๋ ์ด์์ ํ์ผ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ํ์ค์นผ ํ๊ธฐ๋ฒ์ ๋ฐ๋ผ ๋ฐ์ธ๋ฉ ํ์ผ์ด ์์ฑ๋๋ค.
[๋ ์ด์์๋ช
]Binding
๐๐ป ์ด๋ฌํ ํ์์ผ๋ก ์๊ฒผ๋ค.
ex) activity_main.xml ๐๐ป ActivityMainBinding ์ด๋ ๊ฒ ๋๋ค.
๊ทผ๋ฐ ์ด๋ฌํ ์ด๋ฆ ํ๊ธฐ๋ฒ์ด ์ข ๋ณ๋ก ์ผ ์ ์๋ค. ์์ฒญ๋๊ฒ ๊ธด ํด๋์ค ์ด๋ฆ์ด๋ฉด?
๊ทธ๋์ ์ปค์คํ
์ด ๊ฐ๋ฅํ๋ค.
<data
class="Main">
</data>
์์ ๊ฐ์ด class="๋ฐ๊ฟ ์ด๋ฆ"์ ๋ฃ์ด์ ๋ฐ์ธ๋ฉ ์ํฌ ์ ์๋ค.
ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์ ๋ค์ด๋ฐํ ํ์๊ฐ ์๊ฒ ๋ค.
์ฌ๊ธฐ์ ์ ๋ง ๊ธฐ๋ฅ์ฐฌ ๊ธฐ๋ฅ์ด ํ๋ ๋์จ๋ค.๐
android.databinding.adapter
ํจํค์ง ๋ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค@BindingAdapter("app:goneUnless")
fun goneUnless(view: View, visible: Boolean) {
view.visibility = if (visible) View.VISIBLE else View.GONE
}
๋ ์ด์์์์
<TextView
layout_width="wrap_content"
layout_height="wrap_content"
...
app:goneUnless="@{true}" //์ด๋ ๊ฒ ์ฐ๋ฉด ๋๋ค.
/>
์ด ์ผ๋ง๋ ์ฝ๊ฒ ์ฐ์ด๋๊ฐ..๐คฉ