Android 공부/Android AAC

Android ACC : Data Binding

Machine_웅 2021. 1. 6. 16:47
728x90
반응형

데이터 결합을 사용 설정하려면 아래와 같이

모듈의 build.gradle 파일에서 dataBinding 빌드 옵션을 true로 설정합니다.

 

보통 MVVM 패턴을 구현 할 때 "LiveData"와 함께 거의 필수적으로 사용합니다.

 

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

 

 

비교 
이전의 TextView선언 당시

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    >
           <TextView android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="@{user.firstName}"/>
               
           <TextView android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="@{user.lastName}"/>
               
    </LinearLayout>

데이터 바인딩을 사용하기 위해서는 
최상단의 ConstraintLayout을 layout 아래로 둡니다.
그리고 data, variable을 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
       <data>
           <variable name="user" type="com.example.User"/>
       </data>
       <LinearLayout
           android:orientation="vertical"
           android:layout_width="match_parent"
           android:layout_height="match_parent">
           <TextView android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="@{user.firstName}"/>
           <TextView android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="@{user.lastName}"/>
       </LinearLayout>
    </layout>

data 내의 user 변수는 이 레이아웃 내에서 사용할 수 있는 속성을 설명합니다.

type은  사용할 클래스 User의 패키지 경로이다.

<variable name="user" type="com.example.User" />

 

 

레이아웃 내의 표현식은 '@{}' 구문을 사용하여 특성 속성에 작성됩니다. 여기서 TextView 텍스트는 user 변수의 firstName 속성으로 설정됩니다.

 

<TextView android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="@{user.firstName}" />

 

런타임 시 앱의 UI에는 테스트 사용자가 표시됩니다. 또는 다음 예에서와 같이 LayoutInflater를 사용하여 뷰를 가져올 수 있습니다.

  ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());

 

 

Fragment, ListView 또는 RecyclerView 어댑터 내에서 데이터 결합 항목을 사용하고 있다면 다음 코드 예에서와 같이 결합 클래스 또는 DataBindingUtil 클래스의 inflate() 메서드를 사용할 수도 있습니다.

 

 


*참고 ActivityMainBinding클래스는 실제로 없습니다. 안드로이드에서 자동적으로 만들어 줍니다.

그래서 ReBuild 하기 전까지 오류로 표시될것입니다.

하지만 따라가야할 규칙이 있습니다. 멤버변수 클래스 네임은 xml파일을 따라갑니다. 

activity_main.xml ->    ActivityMainBinding

activity_content.xml ->    ActivityContentBinding

activity_love.xml ->    ActivityLoveBinding

main_act.xml    ->    MainActBinding

love_act.xml    ->    LoveActBinding



출처: https://tlshenm.tistory.com/55 [No Job Of Star]

 

 

 

3. 결론

위 샘플용 코드는 간단하게 어떤 형식으로 사용을 하는지 알아보는 예제 입니다.
데이터 집합 클래스를 Bind 해서 해당 클래스가 변경되면

연결된 여러개의 View가 한번에 변경되기 때문에 엄청나게 편해집니다.


또 Databinding과 같이 BindingAdapter를 이용해 ImageView에 Glide, Fresco 같은 이미지 로딩 라이브러리를 이용해서 이미지를 출력을 쉽게 할 수 있고

 

Databinding과  LiveData를 사용하면 Data가 실시간으로 변경될 때

View도 같이 변경되니 MVVM 패턴 구현 시 엄청나게 편리해집니다.

정리하면 다음과 같습니다.

 

  1. Databinding을 사용하면 findViewById(), 버터나이프를 쓰지 않아도 xml에 만든 View들을 자동으로 만들어 준다.

  2. Data가 바뀌면 알아서 바뀐 Data로 View를 변경하게 할수도 있다. (옵저블 사용시)

  3. RecyclerView에서 각각의 item을 세팅 해주는 작업도 xml에서 다 써주면 알아서 척척 값이 들어간다. (요거 엄청 편리합니다.)

  4. JakeWharton의 Butterknife가 Deprecated 되었고 구글에서 권장하므로 앞으로는 Databinding을 사용 해야한다.

 

 

 

 

풀 소스
XML  R.layout.activity_view_bind

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="user" type="com.woongs.woongsProject.View_Bind.User"/>
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}"/>
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}"/>
    </LinearLayout>
</layout>

View_bind.class

package com.woongs.woongsProject;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.os.Bundle;

import com.woongs.woongsProject.databinding.ActivityViewBindBinding;


public class View_Bind extends AppCompatActivity {

	public ActivityViewBindBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       // setContentView(R.layout.activity_view_bind);

        binding = DataBindingUtil.setContentView(this, R.layout.activity_view_bind);
        User user = new User("Test", "User");
        //binding.setUser(user);

        // inflater를 사용하는 경우
        //  ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());

        //Fragment, ListView 또는 RecyclerView 어댑터 내에서 데이터 결합 항목을 사용하고 있다면
        // 다음 코드 예에서와 같이 결합 클래스 또는 DataBindingUtil 클래스의 inflate() 메서드를 사용할 수도 있습니다.
        //ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
        // or
        //ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

    }

    public class User {
        private final String firstName;
        private final String lastName;
        public User(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }
        public String getFirstName() {
            return this.firstName;
        }
        public String getLastName() {
            return this.lastName;
        }
    }

}

 

 

 

주의사항

- 뷰모델의 경우 앞의 첫 글자는 대문자

- 경로중에 대문자로 시작하는 디렉터리가 있으면 안됨... 

- 텍스트에 값을 적용하는 경우  int 형인 경우  string 으로 변환후 적용

( 예시 : android:text="@{String.valueOf(viewmodel.age)}" )

 

 

기본적으로 결합 클래스는 레이아웃 파일 이름을 기반으로 하여

대문자로 시작하고 밑줄(_)을 삭제하며

다음 문자를 대문자로 표기하고 

Binding이라는 단어를 접미사로 추가하는 방법으로 생성됩니다.

 

developer.android.com/topic/libraries/data-binding/generated-binding

 

참고 : 
velog.io/@jojo_devstory/Android-Databinding%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

[Android] Databinding을 알아보자!😎

Android 생태계에서 이미 많이 사용되고 있는 DataBinding(데이터바인딩)은 간단하게 xml파일에 data를 연결(binding)해서 사용할 수 있게 도와줍니다.즉, 레이아웃의 구성요소를 앱의 데이터 소스와 결합

velog.io

 

728x90
반응형

'Android 공부 > Android AAC' 카테고리의 다른 글

DATA_Binding : Fragment  (0) 2022.03.10
MVVM LiveData (1)  (0) 2021.02.22
Android AAC : LiveData  (0) 2021.01.07
Android ACC : Lifecycles  (0) 2021.01.06
Android AAC 란?  (0) 2021.01.06