Android Jetpack
레이아웃 파일(xml)에 데이터를 결합(binding)해주는 Android JetPack 라이브러리 중 하나이다. Activity에서 findViewById()를 통해서 View를 가져올 필요가 없고, 연결된 데이터가 변할 때 쉽게 View에 변경된 데이터를 반영할 수 있는 장점이 있다.
[예제 코드 파일]
1) build.gradle에 dataBinding 추가
android {
...
dataBinding {
enabled = true
}
}
Android Gradle Plugin 3.1.0 버전 이후에는 아래와 같은 새로운 방식이 도입되었다.
android {
...
buildFeatures {
dataBinding = true
buildConfig = true
}
}
2) 레이아웃 파일 수정
1. 루트를 layout으로 설정
2. data 태그 추가
data 태그 내에선 import도 가능하고 변수(variable)도 만들 수 있다. 여기서 만든 test 변수는 type으로 지정한 MainActivity와 연결한 후 해당 클래스에 있는 속성을 사용할 수 있다. 여기서는 TextView의 문자열을 MainActivity의 text 변숫값으로 지정하고 있다. import는 일반적인 코드에서 사용하는 것처럼 import 한 해당 클래스를 참조할 수 있도록 한다. 여기서는 View 클래스를 참조하여 View.GONE과 View.VISIBLE을 가져와서 쓸 수 있다.
3) 데이터 바인딩 설정
레이아웃 파일명인 activity_main이 CamelCase로 변경 후 Binding이 붙은 형태의 ActivityMaindBinding 클래스가 생성된다. 이 클래스는 레이아웃 파일에 바인딩하고 레이아웃 파일에서 사용한 표현식에 값을 할당하는 기능들을 포함하고 있다. 해당 클래스 타입의 binding 변수를 만들고 레이아웃과 연결한다. 레이아웃에서 test 변수의 타입을 MainActivity로 지정했기 때문에 binding.test에 this를 할당한다. binding 변수는 레이아웃과 연결되었기 때문에 레이아웃의 위젯에 바로 접근할 수 있다. 따라서 binding.hideButton에 접근할 수 있기 때문에 클릭 리스너를 설정할 수도 있다.
invalidateAll()은 UI를 새로고침 하기 위해서 모든 바인딩 표현식을 무효화하고 새로운 리바인드를 요청한다. (비효율적인 방식이다. 실제 프로젝트에서는 더 좋은 방법을 사용해야 한다.) 여기서는 isClicked의 상태 변화를 레이아웃에 반영하기 위해 사용한다.
레이아웃에서는 아래와 같이 isClicked 값을 기준으로 TextView를 보여줄지 말지를 결정하고 있다.
android:visibility='@{test.isClicked == true ? View.GONE : View.VISIBLE}'
이 부분을 자세히 보면 레이아웃 내에서 표현식을 사용했음을 알 수 있다. 레이아웃 내에서 표현식을 사용하려면 '@{}' 구문을 사용하면 된다.
이렇게 하면 버튼을 클릭할 때마다 TextView가 사라졌다 나타났다 하는 동작을 한다. 전체적으로 대충 아래와 같이 모두 연결된 상태라고 생각하면 좀 이해가 쉬울 것 같다.
단순히 데이터 바인딩 사용법을 알아보기 위한 단순 예제이기 때문에 큰 장점이 드러나지 않을 수도 있다. 하지만 LiveData와 연계하거나 RecyclerView를 구현할 때 사용하면 정말 편리할 것이다.