뷰 바인딩(View Binding)은 코틀린 코드 상에서 findViewById를 통해 일일히 뷰를 찾아줄 필요 없이,
코틀린 코드 상에서 레이아웃에 더 쉽게 접근할 수 있도록 해주는 기능입니다.
뷰 바인딩 적용 방법은 아래와 같습니다.
build.grandle 에 아래 코드 삽입
buildTypes {
buildFeatures {
viewBinding true
}
}
build.grandle의 buildTypes 부분에 위 코드를 삽입합니다.
코틀린 코드 상에서 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=".LoginActivity">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="50dp"
android:text="@string/obj_login"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.8" />
</androidx.constraintlayout.widget.ConstraintLayout>
액티비티는 보통 Kotlin(Java) 파일과 xml 파일이 쌍을 이룹니다.
LoginActivity.kt 과 이에 대응되는 레이아웃 파일인 activity_login.xml이 있고,
여기에 뷰 객체인 btn_login을 생성하였습니다.
private lateinit var binding: ActivityLoginBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.btnLogin.setOnClickListener {
val intent = Intent(applicationContext, MainBaseActivity::class.java)
startActivity(intent)
}
}
코틀린 코드 상에서 ActivityLoginBindig을 선언하고,
binding을 inflate를 호출하고, setContentView에 root값을 인자로 넘겨줍니다.
이제 binding.(viewName)을 통해 xml 상의 뷰를 참조할 수 있습니다.
xml과 코틀린 코드 상의 변수명때문에 헷갈릴 수 있는데,
activity_login => ActivityLoginBinding
btn_login => btnLogin
과 같이 카멜 표기법으로 변환한다 생각하면 쉬울 것 같습니다.
매번 binding을 적기 귀찮다면,
binding.run {
btnLogin.setonClickListener { }
}
와 같이 매번 binding을 쓰는 과정을 생략할 수 있습니다.