목차
뷰 바인딩
뷰 바인딩 view binding: 레이아웃 XML 파일에 선언한 뷰 객체를 코드에서 쉽게 이용하는 방법
[기존 방법의 문제점]
안드로이드는 UI를 구성할 때 대부분 레이아웃 XML 파일을 이용함
레이아웃 XML 파일에 등록한 뷰는 findViewById()
함수로 얻어서 사용해야 함
그런데 이 작업은 꽤 귀찮음
➡ 한 화면을 구성하는 데만도 많은 뷰가 필요하고, 또 뷰는 대부분 코드에서 이용함.
➡ 따라서 코드에서 뷰 객체를 선언하고 모두 findViewById() 함수로 하나하나 가져와야 함
[해결책]
액티비티에서 findViewById()
함수를 이용하지 않고 레이아웃 XML 파일에 등록된 뷰 객체를 쉽게 사용할 방법
➡ 이러한 기능을 지원하는 butterknife라는 라이브러리도 등장
➡ 이제 butterknife 같은 라이브러리의 도움을 받지 않고서도 코드에서 레이아웃 XML에 선언한 뷰를 쉽게 이용할 수 있음
기존 방법
이처럼 작성한 레이아웃 XML 파일이 있다고 가정해보자.
이곳에 선언한 뷰 3개를 코드 에서 id값으로 얻어서 사용할 수도 있다
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:orientation=”vertical”>
<Button
android:id=”@+id/visibleBtn”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:text=”visible” />
<TextView
android:id=”@+id/targetView”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:text=”hello world”
android:background=”#FF0000”
android:textColor=”#FFFFFF” />
<Button
android:id=”@+id/invisibleBtn”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:text=”invisible” />
</LinearLayout>
</div> </details>
뷰 바인딩 기법 설정
뷰 바인딩 기법을 이용하면 코드에서 훨씬 더 간편하게 뷰 객체를 이용 가능
우선 뷰 바인딩을 사용하려면 그래들 파일에 다음처럼 선언해야 함
➡ build.gradle 파일을 열고 android 영역에 buildFeatures를 선언
➡ 그리고 그 안에 뷰바인딩을 적용하라는 의미로 viewBinding = true를 설정
android {
(... 생략 ...)
viewBinding {
enabled = true
}
}
이렇게 하면 레이아웃 XML 파일에 등록된 뷰 객체를 포함하는 클래스가 자동으로 만들어짐
➡ 즉, 우리가 직접 코드에서 뷰를 선언하고 findViewById()
함수를 호출하지 않아도 이를 구현한 클래스가 자동으로 만들어지므로 이 클래스를 이용해 뷰를 사용하기만 하면 됨
[자동으로 만들어지는 클래스 이름] 자동으로 만들어지는 클래스의 이름은 레이아웃 XML 파일명을 따름
- 첫 글자를 대문자
- 밑줄(
_
)은 빼고 뒤에 오는 단어를 대문자로 만듦 - ‘Binding’을 추가
- ex)
바인딩 객체 얻기
자동으로 만들어진 클래스의 inflate()
함수를 호출하면 바인딩 객체를 얻을 수 있음
이때 인자로 layoutInflater
를 전달
그리고 바인딩 객체의 root 프로퍼티에는 XML 의 루트 태그 객체가 자동으로 등록되므로 액티비티 화면 출력은 setContentView()
함수에 binding.root를 전달하면 됨
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 바인딩 객체 획득
val binding = ActivityMainBinding.inflate(layoutInflater)
// 액티비티 화면 출력
setContentView(binding.root)
// 뷰 객체 이용 (visibleBtn 이용!)
binding.visibleBtn.setOnClickListener {
binding.targetView.visibility = View.VISIBLE
}
// 뷰 객체 이용 (invisibleBtn 이용!)
binding.invisibleBtn.setOnClickListener {
binding.targetView.visibility = View.INVISIBLE
}
}
}
바인딩 객체에 등록된 뷰 객체명은 XML 파일에 등록한 뷰의 id값을 따름.
➡ 즉, XML에 뷰를 <Button android:id=”@+id/visibleBtn” />
처럼 등록했다면,
➡ 바인딩 객체에 visibleBtn
이라는 프로퍼티명으로 등록됨
➡ 따라서 코드에서는 binding.vibileBtn
으로 이용하면 됨
binding 생략 속성
그런데 build.gradle
파일에 뷰 바인딩을 이용하겠다고 선언하면 레이아웃 XML 하나당 바인딩 클래스가 자동으로 만들어지는데,
이때 어떤 레이아웃 XML 파일은 바인딩 클래스로 만들 필요가 없을 수도 있음.
이때는 XML 파일의 루트 태그에 tools:viewBindingIgnore=" true"
라는 속성을 추가
➡ 이 속성을 추가하면 해당 XML 파일을 위한 바인딩 클래스를 만들지 않음
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
(... 생략 ...)
tools:viewBindingIgnore="true">