최근에 작업하던 프로젝트의 kotlin 버전을 업그레이드 하면서 참 많은 문제가 터졌다.
우선적으로 kotlin plugin을 최신화 하기 위해선 IDE를 재설치 해야한다.
2022년3월29일 기준으로 stable version인 bumblebee를 다운로드 받았다.
android studio 4.2v 이상으로 넘어오니 지원하던
kotlinx.android.synthetic
이녀석이 사라졌다.
이런식으로 아이디만 가져오면 자동으로 매핑해주는 친구였는데
ViewBinding으로 바꾸도록 가이드가 되어있다.
관련한 자세한 내용은 링크로 대체한다.
https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
해결방법은 의외로 간단하다.
https://developer.android.com/topic/libraries/view-binding
Activity는 이런식으로 쉽게 변환이 가능하고,
RecyclerView 같은 Adapter를 사용하는 녀석들은
onCreateViewHolder에서 ViewHolder로 넘겨줄때 바인딩으로 넘겨주거나 내부에서 따로 설정해도 된다.
방법 1.
private lateinit var binding: AdpaterDirectoryBinding
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestViewHolder {
binding = AdapterTestBinding.inflate(LayoutInflater.from(parent.context))
return TestViewHolder(binding)
}
class TestViewHolder(binding: AdapterTestBinding) : RecyclerView.ViewHolder(binding.root) {
binding.tvTest.text = "짠"
}
기존에 view를 넘겨주던 것과는 달리 binding을 넘겨준다.
방법 2. (하나의 ViewHolder의 다양한 inflater가 들어가는 경우)
class WholeInfoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun testCase1(testCase1: TestCase1) {
val testCase1Binding = AdapterTestCase1Binding.bind(itemView)
testCase1Binding.testCase1.text = "짠1"
}
fun testCase2(testCase2: TestCase2) {
val testCase2Binding = AdapterTestCase2Binding.bind(itemView)
testCase1Binding.testCase2.text = "짠2"
}
}
이런식으로 onCreateViewHolder는 동일하게 하고, 내부 ViewHolder에서도 추가 가능하다.
Fragment에서 parent Activity의 Component를 가져와야하는 상황이 있을 수 있는데,
private lateinit var binding: ActivityMainBinding
val bind get() = binding
get을 추가해주자.
(requireActivity() as MainActivity).bind.testText.text = "짠"
'프로그래밍 공부 > Android' 카테고리의 다른 글
[android] context 란 (0) | 2022.12.21 |
---|---|
[android-kotlin] firebase notification / message (0) | 2022.07.14 |
[kotlin] LiveData & DataBinding (0) | 2021.07.20 |
[kotlin] Android jetpack Navigation (2) | 2021.05.14 |
[Android&Kotlin] gps tracking (3) | 2021.02.04 |