밍맹의 생각날 때 적는 블로그

Android Studio 4.1로 오면서 사라진 Kotlin extension 대응법 본문

안드로이드

Android Studio 4.1로 오면서 사라진 Kotlin extension 대응법

mingmaeng 2020. 10. 15. 19:07

27기 Sopt 안드 파트장으로 활동하고, 학교도 다니고, 프로젝트도 하는 바쁜 일상을 사는 2020년 하반기...

Android Studio가 4.1로 최신 업데이트가 되면서 여러 가지 기능들이 생겼습니다. (이에 대해서는 추후 포스팅해보겠습니다.)

 

자료도 만들 겸 안드로이드 스튜디오를 켜고 작업을 시작하던 찰나... 이상한 것이 있었으니....

 

아니 이게 외 않되...

여느 때처럼 아무렇지 않게 사용하던 kotlin extension이 안 되는 겁니다...

그래서 다른 프로젝트들도 안되나 싶어서 허둥지둥 열어봤지만 다른 프로젝트들은 다 잘되더군요...

마침 이와 같은 고민을 하고 계시던 파트원분들 중 한 분이 저에게 헬프를 요청하셨었는데, 저도 이러한 현상을 겪으니

해결해야겠다는 마음가짐(을 빙자한 빡침)으로 찾아보게 되었습니다.

 

Gradle을 살펴보고 나서 왜 안되는지 찾을 수 있었습니다.

 

구글링 결과 Android Studio 4.1로 넘어오면서 Kotlin extension plugin이 삭제되었다는 겁니다!!

4.1 이전에 만들어 두었던 프로젝트들에는 삭제되지 않아서 오류가 나지 않았던 것입니다.

 

4.1 이전에 만든 프로젝트 build.gradle

 

4.1 이후에 만든 프로젝트 build.gradle

 

두 사진에 차이를 보시면 'kotlin-android-extensions'가 사라진 것을 볼 수 있습니다.

 

그러면 4.1 이후로는 어떻게 해야 할까요? 다시 findViewById를 쓰자니 이미 extension 없이 살 수 없는(?) 몸이 돼버렸습니다...

 

그래서 대체방법 등을 간단하게 소개해드리려고 합니다.

 


1. plugin 추가

간단합니다. 다시 추가해서 작업하면 됩니다.

 

다음과 같이 extension 추가
잘 됩니다!

2020.10.27 추가 )
코틀린 1.4.20 - M2 Preview업데이트 내용에 extension이 deprecated 된다고 합니다.

해당 방법보다는 아래에 작성한 방법으로 진행하시는게 추후 프로젝트 관리에 도움이 될 것 같습니다!

자세한 내용은 다음 링크를 확인해 주세요.

github.com/JetBrains/kotlin/releases/tag/v1.4.20-M2

 

Release Kotlin 1.4.20-M2 · JetBrains/kotlin

Info about particular features KT-25960 Kapt: Support new @JvmDefault functionality KT-40030 Parcelize: Support the new Parcelize plugin in Gradle KT-41799 String.replace performance improvemen...

github.com

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이 적용되지 않아도 당황하지 마시고 위와 같은 해결법을 통해 클린하게 개발 이어나가시길 바라겠습니다!

Comments