viewBinding
viewBinding ์์๋ฅผ build.grade ํ์ผ์ ๋ณต์ฌํ๋ค.
android {
...
viewBinding {
enabled = true
}
}
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(name๊ณผ button ๋ ํ๋๋ฅผ ๊ฐ์ง)์ด ๋๋ค.
(๋ ์ด์์ ํ์ผ ์ด๋ฆ์ ์นด๋ฉํ๊ธฐ๋ฒ์ผ๋ก ๋ณํ ํ ๋์ Binding์ ์ถ๊ฐ)
๊ฒฐํฉ ํด๋์ค์๋ ์์ํ๋ ๋ ์ด์์ ํ์ผ์ ๋ฃจํธ ๋ทฐ์ ๊ดํ ์ง์ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ๋ getRoot() ๋ฉ์๋๊ฐ ํฌํจ๋๋ค.
(ResultProfileBinding ํด๋์ค์ getRoot()๋ฉ์๋๋ LinearLayout ๋ฃจํธ ๋ทฐ๋ฅผ ๋ฐํํ๋ค.)
Activity์์ ๋ทฐ ๊ฒฐํฉ ์ฌ์ฉ
1 ์์ฑ๋ ๊ฒฐํฉ ํด๋์ค์ ํฌํจ๋ inflate() ๋ฉ์๋๋ฅผ ํธ์ถ
2 getRoot()๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋ Kotlin ์์ฑ ๊ตฌ๋ฌธ์ ์์ํ์ฌ ๋ฃจํธ ๋ทฐ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์ด
3 ๋ฃจํธ๋ทฐ๋ฅผ 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() }
๋ ๋ค๋ฅธ ์ฌ์ฉ ์์
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
val binding = ResultProfileBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
}
์ ์ผ ์ข์ ๋ฐฉ๋ฒ
class MainActivity : AppCompatActivity() {
val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate() {
super.onCreate()
setContentView(binding.root) // * setContentView์๋ binding.root๋ฅผ ๊ผญ ์ ๋ฌ
}
fun test() {
// binding ์ด ํ๋กํผํฐ๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ์กํฐ๋นํฐ ์ ์ฒด์์ ํธ์ถ ๊ฐ๋ฅ
// binding.์์ ฏid.์์ฑ = "๊ฐ"
binding.textView.text = "hello binding"
}
}
Fragment์์ ๋ทฐ ๊ฒฐํฉ ์ฌ์ฉ
class ListFragment : Fragment() {
// lateinit์ผ๋ก binding์ ์ ์ธ
lateinit var binding:FragmentListBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentListBinding.inflate(inflater, container,false)
return binding.root
}
fun test() {
// binding ์ด ํ๋กํผํฐ๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ํ๋๊ทธ๋จผํธ ์ ์ฒด์์ ํธ์ถ ๊ฐ๋ฅ
// binding.์์ ฏid.์์ฑ = "๊ฐ"
binding.textView.text = "hello fragment"
}
}
Adapter์์ ๋ทฐ ๊ฒฐํฉ ์ฌ์ฉ
class CustomAdapter : RecyclerView.Adapter<Holder>() {
// ๋ฐ์ธ๋ฉ.inflate() ๊ตฌ์กฐ๋ ํ๋๊ทธ๋จผํธ์ ๋์ผ
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
val binding = ItemRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return Holder(binding)
}
... ์๋ต
}
// val ์์ฝ์ด๋ก ๋ฐ์ธ๋ฉ์ ์ ๋ฌ ๋ฐ์์ ์ ์ญ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
// ๊ทธ๋ฆฌ๊ณ ์์๋ฐ๋ ViewHolder ์์ฑ์์๋ ๊ผญ binding.root๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
class Holder(val binding: ItemRecyclerBinding) : RecyclerView.ViewHolder(binding.root) {
fun setValue(value:String) {
// ์์ฑ์์์ val๋ก ๋ฐ์๊ธฐ ๋๋ฌธ์ ํ๋ ๋ด๋ถ ์ด๋์์๋ binding ์ฌ์ฉ๊ฐ๋ฅ
binding.textView.text = value
}
}
์ฐธ๊ณ ํ ์ฌ์ดํธ ↓
https://developer.android.com/topic/libraries/view-binding?hl=ko#kotlin
flow9.net/bbs/board.php?bo_table=android&wr_id=27