MathJax.Hub.Register.MessageHook("Math Processing Error",function (message) { alert("Math Processing Error: "+message[1]); }); MathJax.Hub.Register.MessageHook("TeX Jax - parse error",function (message) { alert("Math Processing Error: "+message[1]); });
16 Dec 2020

[Android Studio] Kotlin extension 말고, ViewBinding

안드로이드 앱 개발에는 요즘 코틀린을 많이 쓴다는 말에, 이런저런 비교 영상을 보다가 코틀린으로 뛰어들었다.
대부분 영상에서의 결론은 2가지를 다하면 좋다인데 이런 고민을 하는 것 자체가 어떻게 보면 1가지도 안해본 탓이니..
일단은 코틀린으로 시작했다. 확실히 자바 코드와 상당히 유사하다는 느낌을 많이 받았다.

근데 문제가 생겼다.
onResume()일 때와 아닐 때 글씨를 표시해주고 싶은데, xml에 있는 인덱스를 끌어오는게 뚝딱뚝딱 되질 않았다.
몇 시간의 삽질을 겪고난 뒤 Kotlin extension을 이용하면 자바에서의 findViewById을 쓰지 않고도 할 수 있다는걸 알게됐다.
가령, MainActivity.kt와 activity_main.xml이 연결된 상태이고 xml에 TextView의 id가 textId라면 다음과 같이 쓸 수 있다.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    textId.메소드{
      ...
    }
}


결국 원하는 기능은 구현할 수 있었으나 또 문제가 생겼다.
화면을 A에서 B로 가게하고 싶어서 SubActivity.kt를 만들었는데 여기와 연결된 xml파일에서 id를 못꺼내 오더라.
영상을 참고도 해보고 구글링도 열심히 했는데 extension에 대한 답을 찾질 못했다!! 😇
어떤 분이 도움을 주셨는데 kotlin extension은 더 이상 지원을 하지 않는다고 하더라. 그리고 이 링크를 걸어주셨다.
비효율적이든 어찌됐든 나는 무슨 이윤진 모르겠지만 extension으로는 더 이상의 해결책을 찾을 수 없었기에
참조하는 다른 방법인 ViewBinding을 사용하기로 했다.

build.gradle(:app)에 다음 내용을 추가해준 후 Sync Now를 눌러 적용해주자.

android{
  ...
  viewBinding{
        enabled = true
  }
  ...
}


MainActivity.kt에서는 다음과 같이 설정해주면 된다.

override fun onStart() {
    super.onStart()
    val binding = ActivityMainBinding.inflate(layoutInflater) <-
    setContentView(binding.root) <-
}


빨간 글씨가 뜬다면 Alt+Enter를 눌러서 자동으로 import가 되도록 해주면 문제 해결이다.
위에 써진 것처럼 xml에 id가 textId라면 다음과 같이 쓸 수 있다.

override fun onStart() {
    super.onStart()
    val binding = ActivityMainBinding.inflate(layoutInflater)

    binding.textId.[메소드] { ... } <-

    setContentView(binding.root)
}


조금 내용이 추가된 것 말고는 코드상 큰 차이가 없었다.
SubActivity.kt 에서도 extension을 쓸 때의 문제가 발생하지 않았다! 👍

생각보다 이것저것 설정해줘야 하는 부분이 많았다..

Location

Icheon, KR

Email

iteratively@naver.com

Social

-->