์ด๋ฏธ ์ง์ ์ข ๋ฃ๋ ํ๋ฌ๊ทธ์ธ์ด์ง๋ง, ์์ง ์ ๊ฐ ๋ค๊ณ ์๋ ํ๋ก์ ํธ์์๋ ์ด์ ์จ ์ฌ๋ ์ด ์น๊ตฌ์ ํ๋ฒ ์ ๊ต๋ฅผ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.

๋จผ์ gradle(:app)ํ์ผ ๋ด์ plugins์ ์ ์ฉ๋์ด ์๋ 'kotlin-android-extensions'์ ์ญ์ ํ๊ณ , buildFeature ๋ด๋ถ์ viewBinding์ด ํ์ฑํ๋์ด์์ง ์์ผ๋ฉด true๋ก ํ์ฑํํฉ๋๋ค. ์ ๊ฐ ๋ค๊ณ ์๋ ํ๋ก์ ํธ์๋ ์ด๋ฏธ viewBinding์ด ์ ์ฉ๋์ด ์๊ณ , synthetic๊ธฐ๋ฅ์ ๋ ๊ฑฐ์๋ก ํผ์ฉํ์ฌ ์ฐ๊ณ ์๋ ํํ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ํ์ฑํ๋ ๋์ด์์์ต๋๋ค.
kotlin-android-extensions์ ํตํด ๊ธฐ ์ ์ฉ๋ ์๋น์ค๋ฅผ ๋ณด๋ฉด, kotlin์ synthetic ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ viewBinding์ ๊ฐํธํ๊ฒ ๊ตฌํํ ๋ชจ์ต๋ค์ ๋ณผ ์๊ฐ ์๋๋ฐ, ์ด๋ kotlin-android-extension์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก ํด๋น ํ๋ฌ๊ทธ์ธ์ด ์ญ์ ๋๋ฉด ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. (๋น๋์กฐ์ฐจ ๋์๊ฐ์ง ์์์ ์ค๋ฅ ๋๋ ํฌ์ธํธ๋ ๋ช
ํํ๊ฒ android studio์์ ํ์ธํ ์ ์์ด์)
๋ฐ๋ผ์ ๊ธฐ ์ ์ฉ๋ viewBinding ๋ฐฉ์์ ๋ณ๊ฒฝํด์ผ ํ๋ ์๊ฐ์ด ์ฐพ์์ค๊ฒ ๋๋ ๊ฒ์ธ๋ฐ, ์๋๋ก์ด๋์์ view๋ฅผ ๊ฐ์ฒดํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ด 3๊ฐ์ง ์ ๋์์ต๋๋ค. ์ด์ ๋ 2๊ฐ์ง๋ผ๊ณ ๋ณผ ์ ์๊ฒ ๋ค์.
- findViewById() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ View๋ฅผ ๊ฐ์ฒดํ ํ๋ ๋ฐฉ๋ฒ
- kotlin-android-extension, synthetic ์ ์ฌ์ฉํ์ฌ View๋ฅผ ๊ฐ์ฒดํํ๋ ๋ฐฉ๋ฒ
- ๋ง์ง๋ง์ผ๋ก viewBinding์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์ฌ๊ธฐ์ 2๋ฒ์ ํญ๋ชฉ์ ์ด์ ์ง์ํ์ง ์๋ ๋ด์ฉ์ ๋๋ค. ํ์ฌ ์๋น์ค ์ค์ธ ์ฝ๋์ synthetic์ importํ๋ ํด๋์ค๊ฐ ์๋ค๋ฉด, ์ผ๋จ ํ์ธํด ๋ณด์๊ธธ ๋ฐ๋๋๋ค. ์ ๋ ์๊ณ ์ถ์ง ์์์ด์...ใ

- ์ฐธ๊ณ ๋ก ๋ด์ฉ์ ๋ถ์ด์๋ฉด, synthetic์ kotlin ์ฝ๋ ์ธ๋ถ์ ์์ (view, layout, ...etc)์์ ์กฐํฉ์ ํตํด ๋ง๋ค์ด์ง property๋ค์ ์นญํ๋ ๊ฒ์ผ๋ก kotlin-android-extensions ๋ด์๋ Activity, Fragment, View ํด๋์ค ํน์ ์์ ํด๋์ค๋ค์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ณ XML ๋ด์ ์ ์๋ ๋ทฐ์ ์ธ์คํด์ค์ ๋ฐ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ์ง์ํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
- ๋ฐ๋ผ์ binding์ฒ๋ฆฌ ์์ด id์ ์ ๊ทผ์ด ๊ฐ๋ฅํ์๋ ๊ฒ์ด์ฃ . ์์ฒด์ ์ผ๋ก findViewById()๋ฅผ ์์ฑํด์ ๊ฐ์ฒดํ ํ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด ์ค๋๋ค.
์ด์ findViewById(), viewBidning์ ํตํด์ View๋ฅผ ๊ฐ์ฒดํ ํ๋ฉด ๋๋๋ฐ, ์ฌ์ค findViewById()๋ view๋ง๋ค ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์, ์จ ์ฒ์ง์ findViewById()๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๋จ์ ์ด ์์ต๋๋ค. ์ด๋ฐ ๊ฑธ boilerplate๋ผ๊ณ ๋ ํ๋๋ฐ,, ๋ชจ๋ฅด๊ฒ ๊ณ ,, ๊ทธ๋ฅ ์ผ๋จ ๋์ง๋์ง ๋๊ฐ์ ๋ฌธ์์ด์ด ๋ฐ๋ณต๋์ด ์๋ค? ๋์ ๋ณด๊ธฐ ์์์ง ์๋ค...๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฅ ๋ชป์๊ฒผ์์์.
๊ทธ๋ฌ๋๊น ์ฝ๋ ๊ฐ์ ์ viewBinding์ผ๋ก ํด๋ณผํ
๋ฐ, ๊ธฐ์กด์ kotlin synthetic์ ์ฌ์ฉํ์ฌ viewBinding์ ๊ตฌํํ๋ ์ฝ๋๋ ์๋์ ๊ตฌํ์ผ๋ก ๋์ด์์ต๋๋ค.
์ฌ์ค viewBinding์ ์ฝ๊ฒ ๊ตฌํํ๊ฒ ํด์ค ๊ฒ์ด synthetic์ ๊ธฐ๋ฅ์ด์๊ธฐ ๋๋ฌธ์, ํฌ๊ฒ ๋ฌ๋ผ์ง๋ ๊ฒ์ ์์ง๋ง
์ฃผ๋ก ๋ฌ๋ผ์ง๋ ๊ฒ์ view๊ฐ์ฒด ์์ฒด๋ฅผ ๋๊ฒจ์ฃผ๋ ๊ฒ์ binding.getRoot()๋ก View๋ฅผ ๊ฐ์ฒดํํด์ ๋๊ฒจ์ฃผ๋ ๋ถ๋ถ์ผ๋ก ์์ ๋์์ต๋๋ค.
์ด ์ฝ๋์์๋ ViewHolder์ ์์ฑ ๋ถ๋ถ์ด ํฌ๊ฒ ๋ฐ๋์๋ค๊ณ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์์.
import kotlinx.android.synthetic.main.[layoutName].view.*
class PagerRecyclerAdapter(private val itemList: MutableList<[DataModel]>)
: RecyclerView.Adapter<PagerRecyclerAdapter.PagerViewHolder>() {
inner class PagerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(item: [View]) {
Glide.with(itemView.context)
.load([item.URL])
.into(itemView.[id])
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PagerViewHolder {
val view = LayoutInflater.from(parent.context).inflate(
R.layout.[layoutName],
parent,
false
)
return PagerViewHolder(view)
}
override fun onBindViewHolder(holder: PagerViewHolder, position: Int) {
holder.bind(itemList[position])
}
override fun getItemCount(): Int = itemList.size
}
์ด ์๋๊ฐ viewBinding์ ํตํ RecyclerViewAdapter์ ๊ตฌํ์ธ๋ฐ์. ์ ์ฝ๋์์ ๋ฐ๋ ์ ๋ค์ ํ๋ฒ ๋ณด์๋ฉด ๊ฐ์ด ์ค์ค ๊ฒ ๊ฐ์ต๋๋ค.
import [PackageName].databinding.[ClassName]Binding
class PagerRecyclerAdapter(private val itemList: MutableList<[DataModel]>)
: RecyclerView.Adapter<PagerRecyclerAdapter.PagerViewHolder>() {
inner class PagerViewHolder(private val binding: [ClassName]Binding)
: RecyclerView.ViewHolder(binding) {
fun bind(item: [View]) {
Glide.with(binding)
.load([item.URL])
.into(binding.[id])
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PagerViewHolder {
val binding = [ClassName]Binding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
return PagerViewHolder(binding.root)
}
override fun onBindViewHolder(holder: PagerViewHolder, position: Int) {
holder.bind(itemList[position])
}
override fun getItemCount(): Int = itemList.size
}
binding.root์ ํจ์ ๋ด์ฉ์ ๋๋ค. View๋ฅผ return ํด ์ฃผ๋ ๊ฒ์ ํ์ธํ ์๊ฐ ์์ด์.
/**
* Returns the outermost View in the layout file associated with the Binding. If this
* binding is for a merge layout file, this will return the first root in the merge tag.
*
* @return the outermost View in the layout file associated with the Binding.
*/
@NonNull
@Override
public View getRoot() {
return mRoot;
}
์ด ํจ์๋ฅผ ํตํด, PagerViewHolder innerClass์ binding ๋ณ์๋ก View ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๋ฉด, ๊ทธ ViewBinding์ ํตํด id๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ทธ๋ฐ ๋ด์ฉ์
๋๋ค.
์์ ์์ํ๊ฒ ์ฝ๋ ์ ๋ฐ์ ๋ค์ด๊ฐ ์๋ ๋ด์ฉ๋ค์ด๊ณ ๋ ์ด ๋ถ๋ถ์ด ๋ฆฌ์คํธ๋ฅผ ๊ทธ๋ฆฌ๊ณ , ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ด์ฉ๋ค์ด๋ผ ์ฌ์ด๋ ์ดํํธ๋ ์ ์ง ์๊ฒ ๋ฐ์ํ๋ ์ํฉ์ด ์๊ธฐ๊ณค ํ๋๋ฐ์. ์ด์ฐ์ด์ฐ ํ
์คํธ ์ฝ๋๋ ๋ฃ์ด๊ฐ๋ฉฐ ๋์์ ํ๊ธฐ๋ ํ๋ค์ ใ
ใ
์ด ํฌ์คํ
์ ๋ชฉ์ ์ android-kotlin-extensions์ ๊ฑท์ด๋ด๋ ๊ณผ์ ์ ๋ค๋ฃจ๋ ๊ฒ์ด ๋ชฉ์ ์ด์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ๊ธฐ์ ์ ์ธ ๋ด์ฉ๋ค์ ๋ค๋ฅธ ํฌ์คํ
์์ ๋ค๋ฃจ์ด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.

์ฐธ๊ณ ๋ฌธ์
Kotlin ํฉ์ฑ์์ Jetpack ๋ทฐ ๊ฒฐํฉ์ผ๋ก ์ด์ | Android ๊ฐ๋ฐ์ | Android Developers
์ด ํ์ด์ง๋ Cloud Translation API๋ฅผ ํตํด ๋ฒ์ญ๋์์ต๋๋ค. Kotlin ํฉ์ฑ์์ Jetpack ๋ทฐ ๊ฒฐํฉ์ผ๋ก ์ด์ ์ปฌ๋ ์ ์ ์ฌ์ฉํด ์ ๋ฆฌํ๊ธฐ ๋ด ํ๊ฒฝ์ค์ ์ ๊ธฐ์ค์ผ๋ก ์ฝํ ์ธ ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฅํ์ธ์. Kotlin Android ํ
developer.android.com
'๐ป ๊ฐ๋ฐ์ ์ด์ผ๊ธฐ > ์๋๋ก์ด๋ ์ฝ์ง๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Android ์์ ์งธ๊น์งธ๊น ํ์ด๋จธ ๊ตฌํํ๊ธฐ (0) | 2024.05.03 |
---|---|
ViewBinding์ผ๋ก Binding ์ฒ๋ฆฌํ๊ธฐ. (feat. DataBinding) (1) | 2024.03.23 |
Android API Level 33 ์ ๋ฐ์ดํธ ์ ์ฉ (1) | 2023.08.22 |
Kotlin์ Coroutine, ์ฝ๋ฃจํด #1 (0) | 2023.01.31 |
Navigation, ์์ฃผ ๊ฐ๋จํ๊ฒ Fragment๊ฐ์ ์ ํ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ. (0) | 2022.10.20 |