Data Binding 사용하기

hongbeom
7 min readNov 14, 2019

--

Photo by Aaina Sharma on Unsplash

DataBinding 이란?

데이터 바인딩이 무엇인지 알아보기 전에 Jetpack과 AAC(안드로이드 아키텍처 컴포넌트)에 대해 간단하게 알아볼 필요가 있습니다. 제트팩은 2018년 구글 IO 행사에서 발표된 안드로이드 앱 개발 패키지 묶음입니다. 이 글에서는 제트팩의 구성 요소 중 아키텍처와 관련된 AAC 부분의 데이터 바인딩에 대해 알아볼 것입니다. 데이터 바인딩은 이름 그대로 액티비티나 프래그먼트의 데이터를 화면에 출력하는 부분을 도와주는 AAC 기법입니다.

https://android-developers.googleblog.com

데이터 바인딩 사용하기

데이터 바인딩을 사용하려면 먼저 프로젝트 수준의 build.gradle 파일에 들어가서 다음 사진과 같이 dataBinding 부분을 작성해주어야합니다.

build.gradle

그 다음 데이터 바인딩에 이용하고자 하는 XML에서 루트 태그를 <layout>으로 선언하고 안에 <data> 태그를 선언하여 코드의 데이터가 자동으로 XML의 뷰 객체에 대입되도록 해줍니다.

activity_main.xml

저는 testData 라는 이름으로 데이터를 생성해주었고 이제 이 객체를 사용하기 위해 텍스트뷰를 하나 만들어서 텍스트 안에 testData.name 을 주었습니다.

activity_main.xml

그 다음 메인 액티비티 클래스로 넘어가서 아래 사진과 같이 코드를 작성했습니다. ActivityMainBinding 은 데이터 바인딩을 사용하면 자동으로 만들어지는 클래스 입니다. 늦게 초기화를 해주기 위해 lateinit을 사용하여 변수를 선언하였고 onCreate 함수 내에서 DataBindingUtil 클래스의 setContentView() 함수를 사용하여 어떤 XML을 어디에 이용할지 지정해주었습니다. 그리고 아래줄 코드인 binding.testData = this 에서 XML에 데이터를 대입해주면 됩니다.

자기가 Activity 말고 RecyclerView, ListView, Fragment 등에서 적용하고 싶다면 아래 코드와 같이 LayoutInflater 객체를 이용하면 됩니다. 아래 코드는 프래그먼트 onCreateView() 함수 내에서 이용하는 방법입니다.

binding = FragmentBinding.inflate(inflater, container, false)
// XML 파일 지정하지 않고 사용하기
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container, false);
// XML 파일 지정하고 사용하기

모델 클래스 바인딩 & 배열 타입 바인딩

이번에는 사용자가 임의로 만든 모델 클래스 객체와 배열 타입 객체에 대해 데이터 바인딩을 진행해보겠습니다. 우선 모델 클래스와 배열 타입의 변수를 만들어주었습니다.

User 클래스
MainActivity 클래스

이제 XML파일에 바인딩을 해줍니다. <data> 태그에 User 클래스를 추가해주고 저는 텍스트뷰를 여러 개 만들어서 사용해보았습니다. 배열 데이터는 전부 0번째 인덱스의 데이터를 가져와서 사용하였고 아래 코드와 같이 Integer.toString() 함수를 사용하여 문자열로 변환하여 사용할 수 있습니다.

activity_main.xml
activity_main.xml

마찬가지로 User 모델 클래스도 메인 액티비티 클래스의 onCreate() 함수 내에 binding.user = User(“Ahn”, “Hongbeom”, “01012345678”) 줄을 추가하여 바인딩 해줍니다.

MainActivity 클래스

ObservableField 방식을 사용하여 데이터가 변경될 때 화면에 출력될 값 변경하기 & 리스너 이벤트 바인딩 사용하기

객체의 값은 언제든지 변경될 수 있기 때문에 우리는 값이 변경될 때마다 화면에 변경이 적용된 값을 보여주어야 합니다. 이를 위해 사용하는 방식이 ObservableField 방식입니다. Observable 객체를 이용하여 사용할 수도 있지만 값이 변경될 때마다 notifyPropertyChanged() 함수를 호출해주어야하기 때문에 ObservableField 방식을 사용해보겠습니다. 물론 ObservableField 방식이 더 좋다는 것은 아닙니다. ObservableField로 선언하고 데이터를 변경하게 되면 해당 방식으로 선언한 모든 변숫값의 변경사항이 한꺼번에 적용되게 됩니다. 더불어 리스너 이벤트 바인딩도 사용하여 함께 알아보겠습니다.

우선 BaseObservable()을 상속받는 ObservableUser 클래스를 만들어 줍니다. 저는 onClick() 메소드를 만들어서 버튼을 클릭하면 값이 변경되도록 하였습니다.

ObservableUser 클래스

그 다음 XML파일에 다음과 같이 바인딩을 해줍니다.

activity_main.xml

저는 텍스트뷰를 3개 만들어서 각각 데이터를 텍스트에 넣어주고 버튼에 리스너 이벤트를 넣어주었습니다. observableUser.age는 int형이기 때문에 String형으로 변경시켜주었습니다.

activity_main.xml

마지막으로 ObservableUser() 클래스도 XML에 바인딩 해줍니다.

MainActivity 클래스

실행화면입니다!

읽어주셔서 감사합니다. 다음 글에서는 Retrofit2와 Glide 라이브러리를 사용하여 데이터 바인딩을 해보겠습니다. 피드백은 댓글로 남겨주세요 🙃

참조 — 깡샘의 안드로이드 프로그래밍

--

--

hongbeom
hongbeom

No responses yet