[안드로이드 스튜디오/코틀린] 뷰 바인딩(뷰 결합)
사담
안드로이드, 코틀린을 공부하다보면 종종 생각지도 못한 곳에서 문제가 발생한다. 불과 작년 또는 재작년까지 잘 쓰던 기능인데 올해부터는 못 쓰게 되는 경우도 있다.
뷰아이디를 정석으로 참조하는 방법은 findViewById다. 하지만 이것조차 귀찮았던 많은 개발자들은 kotlin-android-extensions로 뷰아이디를 간편하게 참조했다. 문제는 이 익스텐션의 지원이 불과 작년에 종료됐다는 것이다. 코틀린 안드로이드 익스텐션이 뭔지도 모르는 상태에서 코드를 그대로 따라 치는 방식으로 공부하니 작동이 안 될 수밖에 없다. 다음 강의도, 다다음 강의도 아이디 참조에서 에러가 뜨며 막혔다. 분명 오타 없이 작성했는데 왜 안 되냐며 끙끙거렸는데, 영상에 달린 최근 댓글을 확인하고나서야 viewBinding으로 대체해야 한다는 사실을 알게 됐다.
build.gradle(:app)
android studio 3.6 ~4.0
// android 하위에 viewbinding 코드 입력
android {
viewBinding {
enabled = true
}
}
android studio ver 4.0 이상~
// buildFeatures 하위에 viewbinding 코드 입력
android {
buildFeatures {
viewBinding = true
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:text="뷰바인딩 테스트"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/>
</LinearLayout>
MainActivity.kt
package com.shinyelee.android_study2
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast
import com.shinyelee.android_study2.databinding.ActivityMainBinding
// 메인화면
class MainActivity : AppCompatActivity() {
val TAG: String = "로그"
// (전역변수) 바인딩 객체 선언
// bindingTest null 처리
private var vBinding : ActivityMainBinding? = null
// 매번 null체크 귀찮음 -> 바인딩 변수 재선언
// bindingTest가 null이 아닐 때
private val binding get() = vBinding!!
// 뷰 생성
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 자동 생성된 뷰바인딩 클래스에서의 inflate 메서드 활용
// -> 액티비티에서 사용할 바인딩 클래스의 인스턴스 생성
vBinding = ActivityMainBinding.inflate(layoutInflater)
// getRoot 메서드로 레이아웃 내부 최상위에 있는 뷰의 인스턴스 활용
// -> 생성된 뷰를 액티비티에 표시
// setContentView(R.layout.activity_main)
setContentView(binding.root)
// 이제부터 xml 파일 내 뷰아이디에 접근이 가능해져 findViewById 안 써도 됨
// 뷰아이디가 view_id인 경우 viewId(카멜케이스)로 자동 변환됨
binding.textView.setText("뷰바인딩 어렵지 않쥬?")
}
// 액티비티 파괴시
override fun onDestroy() {
// onDestroy에서 바인딩 클래스 인스턴스 참조를 정리함
vBinding = null
super.onDestroy()
}
// -> 이렇게 해 줘야 메모리 효율이 좋다고 함
}
참고
반응형
'개발(Android) > android studio' 카테고리의 다른 글
[Android Studio/Kotlin] Bottom Navigation View and View Pager (0) | 2022.05.03 |
---|---|
[Android Studio/Kotlin] List View (0) | 2022.05.03 |
[Android Studio] (Vertical) Scroll View, Horizontal Scroll View, Nested Scroll View (0) | 2022.04.29 |
[Android Studio] Font Setting (0) | 2022.04.21 |
[Android Studio/Kotlin] Singleton Pattern (0) | 2022.04.20 |