2021. 2. 14. 13:28ㆍ바삭바삭 IT/안드로이드
ACC(안드로이드 아키텍처 컴포넌트)에서 가장 인기있는 패키지 중 하나인 '데이터 바인딩'을 소개합니다.
데이터바인딩을 이용하면 액티비티 코드를 간결하게 줄일 수 있습니다. 기존에는 아래와 같이 findViewById()를 여러번 호출해야 했습니다.
Button button;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
}
하지만 데이터바인딩을 이용하면 위 코드를 xml에서 대신 처리해주면서 액티비티에서 했던 ui작업이 아주 간단하게 바뀝니다. 사용방법부터 알아볼까요?
사용법
1. 먼저 모듈수준의 gradle파일에 아래처럼 추가해야합니다.
android{
...
dataBinding{
enabled = true
}
}
2. 데이터 바인딩을 쓰는 xml을 <layout> 태그로 감싸줍니다.
<layout>태그만 감싸도 액티비티에서 findViewById()를 할 필요 없이 뷰객체를 바로 사용할 수 있습니다. 내부적으로 이 태그를 감싼 xml으로 클래스가 생성되기 때문입니다. 위에서 activity_main.xml이였다면 ActivityMainBinding클래스가 자동으로 생성됩니다. (test.xml이면 testBinding가 되는것!) 이 바인딩 클래스로 xml에 선언된 뷰 객체를 직접 가져올 수 있는거죠.
<data>태그를 선언하면 코드의 데이터가 자동으로 뷰 객체에 대입됩니다. <variable>태그에 선언된 변수는 ActivityMainBinding클래스에서 자동으로 getter setter함수가 만들어 집니다.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.test.model.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:text="@{user.name}"
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</layout>
※ xml에서 데이터바인딩할때 눈에띄지 않는 오타 때문에 cannot find symbol xxxxBinding에러가 날 수 있으니, 주의해야 합니다!
3. 액티비티 클래스에서 binding객체 생성하기
액티비티 코드를 작성하기 전에 Build탭의 Rebuild Project를 해줍니다. 그 이유는 아래 사용하는 바인딩 클래스가 컴파일러에 의해 생성되기 때문입니다.
ActivityMainBinding binding;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setUser(new User("홍길동"));
}
작동원리
내부에서는 어떻게 xml파일명으로 binding클래스 파일을 만들어 내는 것일까요? 위에서 설명했듯이 activity_main.xml을 빌드하면 ActivityMainBinding.java파일이 컴파일시에 생성된다고 했습니다. 이 파일은 메인폴더에 나타나지 않고 개발자가 건드릴 수도 없습니다. 눈으로 볼 순 없지만 xml코드를 java코드로 바꿔놓았을 것입니다.
위 예에서 binding.setNumberText를 보면 알수 있듯이 ActivityMainBinding클래스에서 setUser함수를 개발자가 추가하지도 않았는데 자동으로 만들어진 것입니다. 클래스 안에 setter가 생긴것이죠.
public abstract void setUser(@Nullbale String name)
그럼 xml에서 아래 코드는 어떻게 작동할까요?
<Button>
android:text="@{user.name}"
....
다음과 같은 과정을 거치게됩니다.
1. User모델 클래스에서 getter함수를 찾습니다. 위 예시에선 getName()이 되겠죠.
2. 선언되있지 않다면 public String name 필드를 찾습니다.
3. getter, 필드 모두 없다면 numberText()를 호출하는데 이 함수도 없다면 에러가 발생합니다.
이와 같은방식으로 모델클래스 외에도 리소스, 컬렉션타입데이터, 이벤트 등을 바인딩 할 수도 있습니다.
결론적으로 데이터바인딩은 mvvm모델로 개발하는데 유용한 도구라고 할 수 있습니다. :)
'바삭바삭 IT > 안드로이드' 카테고리의 다른 글
[안드로이드] WebViewClient와 WebChromeClient (1) | 2021.11.01 |
---|---|
[안드로이드] 저장소 사용하기 - 2. Scoped Storage (0) | 2021.02.24 |
[안드로이드] 저장소 사용하기 - 1. Legacy Storage (1) | 2021.02.23 |
[Android Jetpack] LiveData 사용방법 (0) | 2021.01.24 |
Recycler View 제대로 이해하기 - RecyclerView lifecycle (2) | 2020.11.24 |