[안드로이드 강의작성] View Binding이란 ( Feat. Data Binding )
안드로이드에는 전개된 뷰를 참조하는 findViewById라는 함수가 있다. 이 함수를 많이 봤을 것이다.
setContentView를 이용해 전개한 레이아웃 파일에서, 또는 직접 전개한 뒤에
이 함수를 이용해서, 뷰와 소스코드를 연결한다.
코틀린에서는 이를 조금 더 효율적으로 사용하기 위해서 '코틀린 익스텐션(Kotlin Extension)'을 제공했었지만
다음과 같은 이유로 폐기되었다.
1. 코틀린에서만 사용하므로, 자바에서는 사용불가
2. 일부 상황에서 뷰를 찾을 수 없는 오류 발생
3. 어디서나 뷰를 호출할 수 있기에, 잘못된 참조로 앱이 강제종료 당할 수 있음
따라서 뷰 바인딩 방식을 이용해서 뷰와 코드를 연결한다.
이렇게 하면 findViewById를 사용하지 않으며, 간편하게 뷰와 코드를 연결할 수 있다.
1. build.gradle (app module) 로 들어간다.
2. 뷰 바인딩을 사용하겠다는 코드를 추가해준다.
android {
// 여기서부터
buildFeatures {
viewBinding true
}
// 여기까지
namespace 'made.by.hevton.love'
compileSdk 32
.
.
.
}
viewBinding을 사용하겠다는 옵션이다.
또는 아래처럼 해준다.
viewBinding {
enable = true
}
3. 추가했으면, Sync Now를 해준다.
4. MainActivity.kt 을 열고, 소스 코드를 편집한다.
activity_main.xml을 사용할 것인데, 뷰 바인딩 네이밍 자동변환 공식은 이렇다.
레이아웃파일명(첫 글자와 언더바 다음 영문을 대문자로 변환) + Binding
ex) activity_main.xml = ActivityMainBinding
편집 전 코드
package made.by.hevton.love
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
편집 후 코드
package made.by.hevton.love
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import made.by.hevton.love.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// layoutInflater는 모든 Activity에서 호출할 수 있다.
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root);
}
}
동일한 기능을 하는 코드이다.
5. 활용
현재 activity_main.xml 코드는 다음과 같다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BUTTON"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
이를 토대로, 버튼을 누르면 텍스트가 변경되게끔 수정해보자.
MainActivity.kt
package made.by.hevton.love
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import made.by.hevton.love.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root);
// binding.btn.setOnClickListener(리스너) 리스너를 정의해놨다가 등록 방식
binding.btn.setOnClickListener { // 괄호 안의 코드가 실행되게끔 방식
binding.btn.text = "GOOD !"
}
}
}
버튼을 클릭하면 텍스트가 GOOD ! 으로 바뀐다.
View Binding 말고도 요즘에는 Data Binding 이라는 기술도 많이 쓰이는데,
Data Binding은 View Binding의 기능을 갖춘 확장판이라고 볼 수 있다.
'뭐가 항상 더 낫다' 라기보단, 사용에 따라 View Binding이 더 효율적일 때가 있다.
굳이 Data Binding을 사용하지 않아도 될 때엔 View Binding이 낫다.
데이터 바인딩에 대해서는 다음 글에 추가로 다룬다!