뷰 바인딩은 뷰와 상호작용 하는 코드를 보다 쉽게 작성할 수 있는 기능입니다.
모듈의 build.gradle에서 뷰 바인딩 속성이 활성화되면 해당 모듈에 있는 각 XML레이아웃 파일에 대한
바인딩 클래스가 자동으로 생성됩니다. 바인딩 클래스 인스턴스에는 해당 레이아웃에 ID가 있는 모든 뷰에 대해 직접적으로 참조됩니다.
대부분의 경우에 뷰 바인딩이 findViewById메서드를 대체할 수 있습니다.
ViewBinding 설정하기
뷰 바인딩은 각 모듈별로 활성화됩니다. 모듈에서 뷰 바인딩을 사용하려면
아래의 코드와 같이 요소를 build.gradle파일에 추가합니다.
viewBinding {
enabled = true
}
추가한 뒤 sync now를 눌러 싱크를 맞춰줍니다.
뷰 바인딩 클래스를 생성하는 동안 레이아웃 파일을 무시하려면 아래의 속성을 레이아웃에 추가합니다.
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
ViewBinding 사용하기
MainActivity 부분의 코드를 아래와 같이 입력해줍니다.
private lateinit var binding: ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
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"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/ed_main"
android:hint=" "
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_main"
android:text="btn_main"
/>
</LinearLayout>
두 개 다 변경을 했으면 MainActivity.kt에서
위와 같이 입력했을 때 Xml파일에서 정해준 id가 카멜 표기법으로 변환되어 나오는 것을 확인할 수 있습니다.
저 같은 경우는 버튼을 눌렀을 때 EditText의 hint가 변경되게 해 보겠습니다.
binding.btnMain.setOnClickListener {
binding.edMain.hint = "입력해주세요"
}
위와 같이 입력 후 빌드를 해보면
사실 위와 같이 2개 정도만 쓰는 코드였으면 findViewById가 조금 더 빠르게 제작이 가능하겠지만
2개보다 더 많은 뷰들을 다루게 되면 뷰 바인딩으로 하나하나 ID를 할당해 줄 필요가 없습니다.
ViewBinding과 findViewById의 차이점
findViewId()를 사용해도 액티비티 혹은 프래그먼트 내 뷰를 참조할 수 있지만 뷰 바인딩은 finViewById에 비해
다음과 같은 장점이 있습니다.
- NULL Safety(널 안전) :
바인딩 클래스에서 제공하는 필드는 각 뷰를 직접 참조하게 되어있습니다. 따라서 잘못된 ID를 대입하여
널 포인터 오류가 발생하는 등의 문제가 일어나지 않습니다. 또한 특정 구성에서만 접근할 수 있는 뷰가 있는 경우 이는 @Nullable로 표시되므로 뷰 참조 시 실수를 방지할 수 있습니다. - Type safety(타입 안정성) :
바인딩 클래스 내 필드는 레이아웃 내 선언된 뷰의 타입을 갖습니다. 따라서 잘못된 타입으로 캐스팅하는
실수를 막을 수 있습니다
위와 같은 특성으로 인해 레이아웃과 코드 사이 일치하지 않는 부분이 있다면 컴파일 오류가 발생하게 됩니다.
따라서 앱 배포 후 발생할 수 있는 런타임 오류를 미연에 방지할 수 있습니다.
'Android' 카테고리의 다른 글
[Android] RecyclerView 사용하기 (0) | 2021.02.16 |
---|---|
[Android] ListView 사용 (0) | 2021.02.15 |
[Adroid] Activity LiftCycle (0) | 2021.02.01 |
[Android] Layouts (0) | 2021.01.28 |