본문 바로가기
Coding/Kotlin

[Kotiln] Unresolved reference (Kotlin Android Extensions Deprecated) <추가 binding 한 후 startActivity 실행되지 않을 때>

by Ask & Solve 2021. 1. 22.

Q : 안드로이드 스튜디오에서 코틀린으로 개발하는데 코틀린 책과 달리 xml 버튼 id가 kt 파일에서 연결이 되지 않아요!

 

코틀린으로 안드로이드 앱을 개발하는 책을 보면,

코틀린을 쓰면서 편한 이유 중 하나로

findViewByID같은 것 필요 없이,

그냥 xml의 id를 바로 사용할 수 있어 좋다고 합니다.

 

그런데, 책을 따라서 실제로 해 보면...

Unresolved reference

그 이유는 Kotiln Android Extensoins가 사라졌기 때문인데요.

 

분명히 편리했지만, 에러 발생가능성을 가지고 있기에 그런 듯합니다.

 

자세한 이유는 아래 동영상을 참조하고, 여기서는 해결하는 방법을 알아보겠습니다. 

 

youtu.be/GCbN29rV1Rg

방법은 크게 2가지가 있습니다.

 

1. kotlin android extension을 되살리기

kotlin-android-extensions 되살리기

build.gradle(Module)

plugins {

         ....

         ....

         id 'kotlin-android-extensions'

}

를 추가하고 Sync를 해주면 책에서와 같이 그대로 사용이 가능합니다.

 

2. viewBinding을 사용하기

 

일단 위의 방법보다는 이것이 구글에서 권장하는 것 같습니다만,

과정은 1번보다 조금은 복잡합니다.

 

자세한 내용은

https://developer.android.com/topic/libraries/view-binding 

 

뷰 결합  |  Android 개발자  |  Android Developers

뷰 결합 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있습니다. 모듈에서 사용 설정된 뷰 결합은 모듈에 있는 각 XML 레이아웃 파일의 결합 클래스를 생성합니다. 바인딩 클래스의

developer.android.com

을 참조하시면 되고, 이 내용을 정리해 보면

 

첫 번째로 bulid.gradle에 다음 내용을 추가합니다.

android {

       ...

       viewBinding {

             enabled = true

       }

}

 

<21-07-19 추가>

android {

    ....

    buildFeatures {

        viewBinding = true

    }

}

라고 해도 정상 작동

(무엇이 다른 건지는 시간날 때 찾아보자)

 

build.gradle에 viewBinding 사용설정

 

이렇게 하면 자동으로 viewBinding이 만들어지는데,

그 이름은 xml파일명을 기준하여 Binding을 붙인 형태로 만들어집니다.

예) activity_main.xml -> ActivityMainBinding

 

그다음 실제로 kt파일에서 사용하려면

viewBinding 사용

빨간색 상자와 같이 

binding이라는 변수를 하나 만들어서,

거기에 연결할 xml파일을 기준으로 생성된 Binding을 넣어주고,

실제 사용할 때는 binding.OOO 이런 형태로 사용하시면 됩니다.

 

<21-06-10 추가>

다른 화면 넘어가는 것이 없을 때는 이대로도 상관없었는데,

다른 화면 넘어가려고 하니, startActivity가 실행되지 않음.

 

에러 표시도 나지 않고, 버튼을 누르면 아무 것도 하지 않음.

 

setContentView(

R.layout.activity_main

) 을 setContentView(binding.root)로 바꾸어 주면 정상 작동함!

 

 

<21-07-19 추가>

1. 위의 setContentView(binding.root)는 무조건 추가해 주는 걸로

2. binding.root 대신 root 빼먹는 실수 주의

3. ActivityMainBinding.inflate(layoutInflater)에서 inflate 빼먹는 실수 주의

 

Ask & Solve

(https://www.asknsolve.com)

댓글