
viewBinding
findViewById을 대체하기 위한 것
뷰와 상호작용하는 코드를 쉽게 작성할 수 있으며
바인딩 클래스의 인스턴스에는 상응하는 레이아웃에 ID가 있는 모든 뷰의 직접 참조
대부분의 경우 viewBinding이 findViewById를 대체합니다.
findViewById란?
[layout] .xml 파일에서 지정한 id를 .kt에서 다룰 수 있게 참조하는 것
findViewById 단점
id와 view가 많아지게 되면 id value가 중복이 가능하지만 구별하기 힘들다.
viewbinding 장점
1. Null safety - 뷰의 직접 참조를 생성하여 View ID로 인해 null pointer exception 발생 위험이 없다
2. Type safety - .XML파일에 참조하는 뷰와 일치하여 return type error가 없다.
3. binding을 하는 순간 해당 view의 모든 id를 참조할 수 있다 (시간절약)
build.gradle (Module : .app)
android {
//android 블럭 내부에 추가
viewBinding {
enabled = 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"
android:gravity="center"
>
<TextView
android:text="this text will be change"
android:id="@+id/txtView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/editTxt"
android:layout_width="300dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn"
android:textAllCaps="false"
android:text="Click Here"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
//입력할 텍스트, 바뀌는 텍스트, 버튼 추가
</LinearLayout>

MainActivity.kt (findViewById)
package com.example.test
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Resource에 존재하는 id 중 각각 입력한 id를 찾는다
val txt : TextView = findViewById(R.id.txtView)
val editText : EditText = findViewById(R.id.editTxt)
val btn : Button = findViewById(R.id.btn)
//버튼을 클릭 했을 시 editText에 입력한 값이 txt에 대입된다.
btn.setOnClickListener {
txt.text = editText.text.toString()
}
}
}
Elegance, Compile Time Safety, Build Speed Impact
(깔끔하게), (컴파일 시 보안), (빌드 속도 영향)
전부 만족하지 않으며 .xml view가 추가 될 때마다 직접 입력해야 하는 불편함이 있다
MainActivity.kt (ViewBinding)
package com.example.test
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.test.databinding.ActivityMainBinding
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
//카멜 표기법으로 변환하고 끝에 'Binding'을 추가하여 생성
//binding의 규칙 xml명 : activity_main → ActivityMainBinding
//만약 xml명이 result_profile이라면 → ResultProfileBinding
//binding 변수 생성
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
//현재 Ui 저장
super.onCreate(savedInstanceState)
//inflate 메소드가 액티비티에서 사용할 바인딩 클래스의 인스턴스 생성
//inflate 메소드 호출 하면 사용할 인스턴스가 생성
binding = ActivityMainBinding.inflate(layoutInflater)
//최상단인 root와 연결하여 출력
setContentView(binding.root)
//AcitvityMainBinding이 xml 파일 내에 저장되어 있는 id를 찾는다
binding.btn.setOnClickListener {
txtView.text = editTxt.text.toString()
}
}
}
요약
findViewById - view 추가시 마다 참조
ViewBinding - binding 자체가 스스로 찾아줌
카멜 표기법으로 변환하고 끝에 'Binding'을 추가하여 생성
binding의 규칙 xml명 : activity_main → ActivityMainBinding
만약 xml명이 result_profile이라면 → ResultProfileBinding
binding 변수 생성해주기
private lateinit var binding : ActivityMainBinding
메서드 생성해주기
binding = ActivityMainBinding.inflate(layoutInflater)
ContentView 변경하기
setContentView(binding.root)
https://developer.android.com/topic/libraries/view-binding?hl=ko

'Android-Kotlin📱' 카테고리의 다른 글
| Kotlin 숫자 구별을 위한 확장함수(Extension Function) (0) | 2022.05.17 |
|---|---|
| Kotlin BMI With ViewBinding (코틀린 뷰바인딩 BMI) (0) | 2022.05.17 |
| Kotlin Retrofit (0) | 2022.05.09 |
| Kotlin 갤러리 권한 요청 및 설명 팝업 (0) | 2022.04.25 |
| Kotlin Collection (코틀린 Collection) (0) | 2022.03.30 |