27기 Sopt 안드 파트장으로 활동하고, 학교도 다니고, 프로젝트도 하는 바쁜 일상을 사는 2020년 하반기...
Android Studio가 4.1로 최신 업데이트가 되면서 여러 가지 기능들이 생겼습니다. (이에 대해서는 추후 포스팅해보겠습니다.)
자료도 만들 겸 안드로이드 스튜디오를 켜고 작업을 시작하던 찰나... 이상한 것이 있었으니....
여느 때처럼 아무렇지 않게 사용하던 kotlin extension이 안 되는 겁니다...
그래서 다른 프로젝트들도 안되나 싶어서 허둥지둥 열어봤지만 다른 프로젝트들은 다 잘되더군요...
마침 이와 같은 고민을 하고 계시던 파트원분들 중 한 분이 저에게 헬프를 요청하셨었는데, 저도 이러한 현상을 겪으니
해결해야겠다는 마음가짐(을 빙자한 빡침)으로 찾아보게 되었습니다.
Gradle을 살펴보고 나서 왜 안되는지 찾을 수 있었습니다.
구글링 결과 Android Studio 4.1로 넘어오면서 Kotlin extension plugin이 삭제되었다는 겁니다!!
4.1 이전에 만들어 두었던 프로젝트들에는 삭제되지 않아서 오류가 나지 않았던 것입니다.
두 사진에 차이를 보시면 'kotlin-android-extensions'가 사라진 것을 볼 수 있습니다.
그러면 4.1 이후로는 어떻게 해야 할까요? 다시 findViewById를 쓰자니 이미 extension 없이 살 수 없는(?) 몸이 돼버렸습니다...
그래서 대체방법 등을 간단하게 소개해드리려고 합니다.
1. plugin 추가
간단합니다. 다시 추가해서 작업하면 됩니다.
2020.10.27 추가 )
코틀린 1.4.20 - M2 Preview업데이트 내용에 extension이 deprecated 된다고 합니다.
해당 방법보다는 아래에 작성한 방법으로 진행하시는게 추후 프로젝트 관리에 도움이 될 것 같습니다!
자세한 내용은 다음 링크를 확인해 주세요.
github.com/JetBrains/kotlin/releases/tag/v1.4.20-M2
2. ViewBinding 사용
사라진건 사라진 거니 어쩔 수 없다! 근데 findViewById는 사용하기 싫다! 하시는 분들은 ViewBinding을 사용하시면 됩니다.
ViewBinding을 사용하기 위해서 다음과 같이 gradle 세팅을 해줍니다.
android {
...
// Android Studio 3.6.0
viewBinding {
enabled = true
}
// Android Studio 4.0
buildFeatures{
viewBinding = true
}
}
그리고 바인딩 클래스를 생성하는 동안 레이아웃 파일을 무시하려면 다음 속성을
레이아웃 파일 최상단 Layout에 추가해주세요. -> ViewBinding을 만들고 싶지 않다면 추가해주세요!
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
그리고 액티비티에서 다음과 같이 사용하면 됩니다.
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
binding.mainText.setOnClickListener {
// 원하는 코드 작성
}
}
}
프래그먼트에서는 다음과 같이 사용합니다.
class SampleFragment : Fragment() {
private var _binding : FragmentSampleBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentSampleBinding.inflate(inflater,container,false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.fragmentTxt.setOnClickListener{
// 코드 작성
}
}
override fun onDestroy() {
super.onDestroy()
_binding = null
}
}
갑자기 잘 쓰던 Kotlin Extension이 안돼서 당황했는데 이 간편한걸 왜 지웠는가...라는 생각도 했지만
다른 블로그를 탐방하면서 왜 지웠는지 어느 정도 납득이 갔습니다.
그렇다고 extension을 아예 못쓰는 것도 아니고요 ㅎㅎㅎ Android Strudio 4.1 이후로 Kotlin으로 작업하실 때
extension이 적용되지 않아도 당황하지 마시고 위와 같은 해결법을 통해 클린하게 개발 이어나가시길 바라겠습니다!
'안드로이드' 카테고리의 다른 글
[Android/Kotlin] 비동기 작업을 위한 Coroutine을 Araboza! (1) (0) | 2021.01.13 |
---|---|
[Android/Kotlin] MotionLayout - 3 ( Lottie와 ViewPager 활용 ) (0) | 2020.12.21 |
[Android/Kotlin] MotionLayout - 2 ( 실제로 적용해보자.) (0) | 2020.09.17 |
[Android/Kotlin] MotionLayout (애니메이션을 쉽게 적용하기) (3) | 2020.09.06 |
[Android/Kotlin]( MVVM 다가가기 )ViewModel + LiveData + DataBinding (3) | 2020.08.03 |