본문 바로가기

Android/AAC

[Android] 데이터 바인딩 (Data Binding) 기본 사용 방법

728x90

DataBinding 적용 최소 사항

  • Android 2.1 (API 7, Android Nougat) 이상
    • 안드로이드 누가의 경우, 19년 10월을 기준으로 지원 중단.
    • 갤럭시 S6이상의 기기에서 사용 가능.
  • Android Plugin for Gradle 1.5.0-alpha1 이상
  • Android Studio 1.3 이상

DataBinding 사용 설정

 

// build.gradle (Module:app)

android {

	...
    
    
	dataBinding {
		enable = true
	}
    
	...
    
}

 

gradle에서 dataBinding에 대한 enable 옵션을 true로 설정해주기만 하면 된다.

위의 옵션으로 설정을 하면, 컴파일러가 컴파일 시 자동으로 필요한 바인딩 클래스를 작성해 주기 때문에 따로 implementation 코드는 필요하지 않다.

 

XML 설정

 

// main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:app="http://schemas.android.com/apk/res-auto"
	xmlns:tools="http://schemas.android.com/tools">
    
    
	<data>
		<variable
			name="sample"
			name="com.heegs.android.databindingsample.SampleActivity"/>
	</data>


	<LinearLayout
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:orientation="vertical">
        
		...
        
        
	</LinearLayout>

</layout>

 

 

기존의 사용하던 방식과 다른 2가지가 보이는데,

  • 최상위 태그가 Layout 인 것과
  • Data 태그를 사용하는 것이다.

우선, 기존에 사용하던 최상위(루트) 태그를 layout으로 선언하여 사용한다.

layout 태그는 하나의 레이아웃만 자식 뷰로 가질 수 있기 때문에 사용에 유의해야 한다.

 

data태그는 레이아웃에서 사용하고자하는 변수를 정의해주는 태그라고 보면 된다.

위와 같이 data 태그를 정의하면 다음과 같이 사용이 가능하다.

 

// JaVA

data class SampleActivity {
	String text = "sample Text";
}


// XML

<TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{sample.text}"
        android:layout_gravity="center"/>

 

여기서 헷갈릴 수 있는 부분은, TextView에서 데이터 바인딩을 사용하는 부분이다.

우선 xml에 데이터 바인딩을 설정한 부분부터 다시 확인 해보자.

 

<data>
	<variable
		name="sample"
		name="com.heegs.android.databindingsample.SampleActivity"/>
</data>

 

이 부분은 해당 xml에서 SampleActivity를 사용할 것이며, 변수 이름은 sample로 사용하겠다고 정의를 한 것이다.

 

android:text="@{sample.text}"

 

TextView에서 해당 부분은 sample라는 곳에 있는 text를 가져와서 세팅하겠다. 라는 의미이다.

즉, sample은 SampleActivity를 뜻하는 것이며, SampleActivity에 있는 text라는 변수를 사용하겠다는 말이 된다.

 

위의 예제는 변수를 사용한 것인데, 이것 뿐 아니라 ClickListener를 바인딩해서 사용할 수 있다.

 

// JAVA

data class SampleActivity {
	String text = "sample Text";
    
	...
    
    
	public void onButtonClick (View view) {
		Toast.makeText(this, "Click", Toast.LENGTH_SHORT).show();
	}
}



// XML

<Button
	android:id="@+id/sample_btn"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:onClick="@{sample::onButtonClick()}"
	android:text="button"
/>

 

data 태그에 선언한 부분은 위와 같다고 생각하고 보면 된다.

여기서 바인딩 한 부분은 onClick에서 사용되는 ClickListener 부분이다.

변수를 바인딩할 때와 동일한 방법으로 작성하면 되지만, 변수가 아닌 함수를 사용하기 때문에 sample::함수이름() 을 사용하였다.

 

이 때, 변수 처럼 sample.함수이름()으로 사용해도 동작하기는 하지만, deprecated 되었으며, @{sample::함수이름()} 으로 사용하도록 공식 문서에서도 가이드하고 있으므로 해당 방식대로 사용하였다.

 

액티비티 세팅.

액티비티에서 DataBinding을 세팅하기 위해서는, 위의 일련의 작업을 진행 한 후 Rebuild Project를 진행 한 다음 세팅해주는 것이 좋다. 컴파일러가 바인딩 클래스를 생성해주기 때문에 컴파일을 다시 실행해 주는 것이다.

 

바인딩 클래스는 다음과 같은 규칙을 따른다.

  • Binding class는 레이아웃 파일의 이름을 파스칼 표기법 기준으로 변환 후 접미에 Binding을 붙여서 생성한다.
    • main_activity.xml 의 경우 MainActivityBinding 으로 자동 생성.
  • 포넌트 아이디는 "_" 를 기준으로 카멜 표기법으로 변환시킨다.
    • 컴포넌트 id 값이 sample_btn 의 경우 sampleBtn 으로 자동 생성.
// JAVA

data class SampleActivity extends AppCompatActivity {
	MainActivityBinding binding; // main_activity.xml 사용
    
	...
    
	protected void onCreate(@Nullable Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        
		binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
		binding.setSample(this);
	}
}

 

 

main_activity.xml을 사용했기 때문에 Binding class는 MainActivityBinding 으로 생성되었으며

data 태그에서 변수 sample을 선언하였기 때문에 setSample 함수 또한 자동으로 생성된 것이다.

 

DataBindingUtil 클래스를 사용하여 레이아웃을 Binding하고,

binding.setSample(this)을 통하여 sample이라는 변수를 해당 Class로 지정하겠다는 의미를 나타낸다.

728x90