본문 바로가기
Android

[깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 정리 11 - ViewBinding

by 들풀민들레 2022. 5. 9.

책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.

본 글은 [깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책 혹은 인강(www.ssamz.com)을 통해 확인해 주세요.

 

3.4. ViewBinding


ViewBinding 기법은 레이아웃 XML 파일에 선언된 뷰 객체를 코드에서 쉽게 이용할 수 있도록
합니다. 이미 살펴보았듯이 레이아웃 XML 파일에 선언된 뷰 객체를 코드에서 이용하기 위해서 뷰의
식별자를 id 속성으로 등록한 후에 코드에서 findViewById() 함수로 뷰 객체를 획득해 주어야 합니다.
그런데 실제로 앱을 개발해보면, 하나의 XML에 수십 개의 뷰가 선언됩니다. 따라서 코드에 수십 줄의
findViewById() 함수가 작성되어야 합니다. 이는 상당히 귀찮은 작업입니다.


findViewById() 함수를 반복적으로 사용하지 않고 코드에서 쉽게 레이아웃 XML 파일에 선언된 뷰
객체를 이용할 수는 없을까요? 이런 고민에 의해 다양한 방안이 고안되었습니다. 이곳에서 소개하고자
하는 ViewBinding 기법은 가장 최근에 나온 방식으로, 쉽게 코드에서 뷰 객체를 이용할 수 있도록
합니다. 이후 책에서 다루는 모든 코드에서 ViewBinding 기법으로 뷰 객체를 이용할 것입니다.
ViewBinding 기법으로 이용할 레이아웃 XML 파일이 아래와 같이 선언되어 있다고 가정해
보겠습니다.

 

<?xml version="1.0" encoding="utf-8"?>
<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"
android:padding="16dp"
android:visibility="invisible"/>
<Button
android:id="@+id/invisibleBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="invisible"/>
</LinearLayout>

이전에 살펴보았던 레이아웃 XML 파일과 차이가 없습니다. id 속성값을 적절하게 설정하여 뷰를
선언하였습니다. 이처럼 ViewBinding 기법을 사용할 때, 레이아웃 XML 파일에는 수정해야 할 부분이
없습니다. 아래와 같이 ViewBinding 기법을 이용한다는 선언을 모듈 수준의 build.gradle 파일에
해주어야 합니다.

 

모듈 수준의 build.gradle 파일에 위의 내용을 선언하는 것만으로 ViewBinding 기법을 이용하기
위한 모든 설정이 끝나게 됩니다. 이렇게 하면, 빌더에 의해 레이아웃 XML 파일에 선언한 뷰 객체를
가지는 클래스가 자동으로 만들어지게 됩니다. 이 클래스의 이름은 레이아웃 XML 파일명이 변형되어
붙여집니다. 단어의 첫 글자가 대문자로 바뀌고 밑줄(_)은 제거되며, "Binding"이라는 문자가 추가된
상태로 클래스명이 지정됩니다. 레이아웃 XML 파일명과 ViewBinding 기법에 의해 자동으로
만들어지는 클래스명을 살펴봅시다.

  • activity_main.xml → ActivityMainBinding
  • item_main.xml → ItemMainBinding
  • test.xml → TestBinding


이제 자동으로 만들어진 Binding 클래스를 코드에서 이용하기만 하면 됩니다. 아래의 코드는
activity_main.xml 파일을 이용하는 Activity 내의 코드입니다.

 

public class MainActivity extends AppCompatActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//뷰바인딩 객체 획득
		ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
		//액티비티 화면 출력
		setContentView(binding.getRoot());
		//뷰 객체 이용
		binding.visibleBtn.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v) {
				binding.targetView.setVisibility(View.VISIBLE);
			}
		});
		binding.invisibleBtn.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v) {
				binding.targetView.setVisibility(View.INVISIBLE);
			}
		});
	}
}

코드를 보면 뷰 객체를 선언하지도 않고 findViewById () 함수로 획득하지도 않았음에도 레이아웃
XML에 선언된 뷰를 이용하고 있습니다. 자동으로 만들어진 ActivityMainBinding 클래스 내에 이미
이용하고자 하는 뷰 객체가 선언되어 있고, 획득되어 있어서 코드에서는 뷰를 이용만 하면 됩니다.
ActivityMainBinding에 선언된 뷰 객체의 이름은 레이아웃 XML에 등록된 id 속성값으로 지정됩니다.
Button 뷰의 id 속성값이 <Button android:id="@+id/visibleBtn" />으로 선언되었기 때문에,
코드에서 binding.targetBtn으로 해당 뷰를 사용할 수 있습니다.

 

책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.