Q : 안드로이드 스튜디오에서 코틀린으로 개발하는데 코틀린 책과 달리 xml 버튼 id가 kt 파일에서 연결이 되지 않아요!
코틀린으로 안드로이드 앱을 개발하는 책을 보면,
코틀린을 쓰면서 편한 이유 중 하나로
findViewByID같은 것 필요 없이,
그냥 xml의 id를 바로 사용할 수 있어 좋다고 합니다.
그런데, 책을 따라서 실제로 해 보면...
그 이유는 Kotiln Android Extensoins가 사라졌기 때문인데요.
분명히 편리했지만, 에러 발생가능성을 가지고 있기에 그런 듯합니다.
자세한 이유는 아래 동영상을 참조하고, 여기서는 해결하는 방법을 알아보겠습니다.
방법은 크게 2가지가 있습니다.
1. kotlin android extension을 되살리기
build.gradle(Module)에
plugins {
....
....
id 'kotlin-android-extensions'
}
를 추가하고 Sync를 해주면 책에서와 같이 그대로 사용이 가능합니다.
2. viewBinding을 사용하기
일단 위의 방법보다는 이것이 구글에서 권장하는 것 같습니다만,
과정은 1번보다 조금은 복잡합니다.
자세한 내용은
https://developer.android.com/topic/libraries/view-binding
을 참조하시면 되고, 이 내용을 정리해 보면
첫 번째로 bulid.gradle에 다음 내용을 추가합니다.
android {
...
viewBinding {
enabled = true
}
}
<21-07-19 추가>
android {
....
buildFeatures {
viewBinding = true
}
}
라고 해도 정상 작동
(무엇이 다른 건지는 시간날 때 찾아보자)
이렇게 하면 자동으로 viewBinding이 만들어지는데,
그 이름은 xml파일명을 기준하여 Binding을 붙인 형태로 만들어집니다.
예) activity_main.xml -> ActivityMainBinding
그다음 실제로 kt파일에서 사용하려면
빨간색 상자와 같이
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)
댓글