๋ทฐ์ ์ํธ์์ฉํ๋ ์ฝ๋๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ.
๋ชจ๋์์ ๋ทฐ ๋ฐ์ธ๋ฉ์ ํ์ฑํํ๋ฉด ํด๋น ๋ชจ๋์ ์๋ ๊ฐ XML ๋ ์ด์์ ํ์ผ์ ๋ํด ๋ฐ์ธ๋ฉ ํด๋์ค๋ฅผ ์์ฑํจ.
๋ฐ์ธ๋ฉ ํด๋์ค์ ์ธ์คํด์ค๋ ํด๋น ๋ ์ด์์์ ID๊ฐ ์๋ ๋ชจ๋ ๋ทฐ์ ๋ํ ์ง์ ์ ์ธ ์ฐธ์กฐ๋ฅผ ํฌํจ.
๋ทฐ ๋ฐ์ธ๋ฉ์ findViewById๋ฅผ ๋์ฒดํจ.
android {
...
buildFeatures {
viewBinding = true
}
}
๋ ์ด์์ ํ์ผ์ ๋ฐ์ธ๋ฉ ํด๋์ค๋ฅผ ์์ฑํ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ tools:viewBindingIgnore="true" ๋ฅผ ์ถ๊ฐํด์ผ ํจ.
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
๊ฐ ๋ฐ์ธ๋ฉ ํด๋์ค์๋ ๋ฃจํธ ๋ทฐ์ ID๊ฐ ์๋ ๋ชจ๋ ๋ทฐ์ ๋ํ ์ฐธ์กฐ๊ฐ ํฌํจ๋จ.
๋ฐ์ธ๋ฉํด๋์ค์ ์ด๋ฆ์ XML ํ์ผ์ ์ด๋ฆ์ ํ์ค์นผ ์ผ์ด์ค๋ก ๋ณํํ๊ณ , "Binding"์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ค์ ์ถ๊ฐํ์ฌ ์์ฑ๋จ.
result_profile.xml ์ด๋ผ๋ ๋ ์ด์์ ํ์ผ์ด ์๋ ๊ฒฝ์ฐ
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
์์ฑ๋ ๋ฐ์ธ๋ฉ ํด๋์ค๋ช ์ ResultProfileBinding.
์์ ์ฝ๋์์ ImageView๋ id๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฏ๋ก ๋ฐ์ธ๋ฉ ํด๋์ค์์ ์ด๋ฅผ ์ฐธ์กฐํ์ง ์์.
๋ฐ์ธ๋ฉ ํด๋์ค๋ ํด๋น ๋ ์ด์์ ํ์ผ์ ๋ฃจํธ๋ทฐ๋ฅผ ์ฐธ์กฐํ ์ ์๋ getRoot()
๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์.
๐ ResultProfileBinding ํด๋์ค์์๋ getRoot()
๋ฉ์๋๊ฐ LinearLayout ๋ฃจํธ ๋ทฐ๋ฅผ ๋ฐํํ๊ฒ ๋จ.
์กํฐ๋นํฐ์์ ๋ฐ์ธ๋ฉ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ค์ ํ๊ธฐ ์ํด onCreate()
๋ฉ์๋์์ ๋ค์์ ์ํํจ.
์์ฑ๋ ๋ฐ์ธ๋ฉ ํด๋์ค์ ํฌํจ๋ ์ ์ inflate()
๋ฉ์๋๋ฅผ ํธ์ถ.
๐ ์กํฐ๋นํฐ์์ ์ฌ์ฉํ ๋ฐ์ธ๋ฉ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์์ฑ๋จ.
๋ฃจํธ ๋ทฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ป๊ธฐ ์ํด getRoot()
๋ฅผ ํธ์ถํ๊ฑฐ๋ ์ฝํ๋ฆฐ ํ๋กํผํฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉ.
๋ฃจํธ ๋ทฐ๋ฅผ setContentView()
์ ์ ๋ฌํ์ฌ ํ๋ฉด์์ ํ์ฑ ๋ทฐ๋ก ๋ง๋ฆ.
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
ํ๋๊ทธ๋จผํธ์์ ๋ฐ์ธ๋ฉ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ค์ ํ๊ธฐ ์ํด onCreateView()
๋ฉ์๋์์ ๋ค์์ ์ํ.
์์ฑ๋ ๋ฐ์ธ๋ฉ ํด๋์ค์ ํฌํจ๋ ์ ์ inflate()
๋ฉ์๋๋ฅผ ํธ์ถ.
๐ ํ๋๊ทธ๋จผํธ์์ ์ฌ์ฉํ ๋ฐ์ธ๋ฉ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์์ฑ๋จ.
๋ฃจํธ ๋ทฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ป๊ธฐ ์ํด getRoot()
๋ฅผ ํธ์ถํ๊ฑฐ๋ ์ฝํ๋ฆฐ ํ๋กํผํฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉ.
๋ฃจํธ ๋ทฐ๋ฅผ onCreateView()
๋ฉ์๋์ ๋ฐํํ์ฌ ํ๋ฉด์์ ํ์ฑ ๋ทฐ๋ก ๋ง๋ฆ.
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
ํ๋๊ทธ๋จผํธ๋ ๋ทฐ๋ณด๋ค ์ค๋ ์ด์๋จ์. ๋ฐ๋ผ์ ํ๋๊ทธ๋จผํธ์ onDestroyView()
์์ ๋ฐ์ธ๋ฉ ํด๋์ค ์ธ์คํด์ค์ ๋ํ ๋ชจ๋ ์ฐธ์กฐ๋ฅผ ์ ๋ฆฌํด์ผ ํจ. (๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๋ ค ํด๋ binding์ด ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ด ํ์ํ์ง ๋ชปํด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์)
# ์ธ๋ก๋ชจ๋ xml
# in res/layout/example.xml
<TextView android:id="@+id/user_bio" />
# ๊ฐ๋ก๋ชจ๋ xml
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" />
TextView
๊ฐ TextView
์ EditText
์ ๊ณตํต ์์ ํด๋์ค์ด๋ฏ๋ก TextView
ํ์
์ ๊ฐ์ง userBio ํ๋๋ฅผ ๋
ธ์ถ์ํฌ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง๋ง, ๊ธฐ์ ์ ์ ์ฝ์ผ๋ก ์ธํด ๋ทฐ ๋ฐ์ธ๋ฉ ์ฝ๋ ์์ฑ๊ธฐ๋ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ด View
ํ์
ํ๋๋ฅผ ์์ฑํจ.
๋ฐ๋ผ์ binding.userBio as TextView์ ๊ฐ์ด ์บ์คํ ํด์ผ ํจ.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด tools:viewBindingType ์์ฑ ์ง์. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ๋ฌ์๊ฒ ์์ฑ๋ ์ฝ๋์์ ์ฌ์ฉํ ํ์ ์ ์๋ ค์ค ์ ์์.
# in res/layout/example.xml (unchanged)
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />
# in res/layout/navigation_example.xml
<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
# in res/layout-w720/navigation_example.xml
<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
ํ๋๋ BottomNavigationView๋ฅผ ํฌํจํ๊ณ ๋ค๋ฅธ ํ๋๋ NavigationRailView๋ฅผ ํฌํจํ๋ ๋ ๊ฐ์ ๋ ์ด์์์ด ์๋ ๊ฒฝ์ฐ, ๋ ํด๋์ค๋ NavigationBarView๋ฅผ ํ์ฅํจ.
ํ์ฌ ๋ ์ด์์์ ์ด๋ค ํ์ ํด๋์ค๊ฐ ์๋์ง ์ ํํ ์ ํ์๊ฐ ์์ ๊ฒฝ์ฐ tools:viewBindingType์ ์ฌ์ฉํ์ฌ ๋ ๋ ์ด์์์์ ์์ฑ๋ ์ ํ์ NavigationBarView๋ก ์ค์ .
android.view.View
๋ฅผ ์์ํ ํด๋์ค์ฌ์ผ ํจ.๋์ํ์ง ์๋ ์ฝ๋
<TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. -->
<TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
Null safety
๋ทฐ ๋ฐ์ธ๋ฉ์ ๋ทฐ์ ์ง์ ์ ์ผ๋ก ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๋ทฐ id๋ก ์ธํ ๋ ํฌ์ธํฐ ์์ธ์ ์ํ์ด ์์.
Type safety
๋ฐ์ธ๋ฉ ํด๋์ค์ ๊ฐ ํ๋๋ xml ํ์ผ์์ ์ฐธ์กฐํ๋ ๋ทฐ์ ์ผ์นํ๋ ํ์์ ๊ฐ์ง.
๐ ํด๋์ค ์บ์คํธ ์์ธ์ ์ํ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธ.
view binding๊ณผ data binding์ ๋ชจ๋ ๋ทฐ๋ฅผ ์ง์ ์ฐธ์กฐํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ฐ์ธ๋ฉ ํด๋์ค๋ฅผ ์์ฑ.
ํ๋ก์ ํธ์ ๋ฐ๋ผ์ view binding๊ณผ data binding์ ๋ชจ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ์ ์์.
๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ํ์๋ก ํ๋ ๋ ์ด์์์ ์ฌ์ฉํ๊ณ , ๋ทฐ ๋ฐ์ธ๋ฉ์ ๊ทธ๋ ๊ฒ ์์ ๋ ์ด์์์ ์ฌ์ฉ.