안드로이드

안드로이드 Databinding Observable 사용하기. 변화감지. @Bindable

알통몬_ 2019. 4. 5. 12:44
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 

이번 포스팅에서는 안드로이드 DataBinding의 Observable을 사용하는 방법에 대해 알아봅니다.

기본적으로 Databinding에 대해 아시는 분들만 읽으시길 ㅎㅎ

구글 공식문서에서 설명하는 Databinding의 Observable은 아래와 같습니다.

Observable 객체 

android.databinding.Observable 인터페이스를 구현하는 클래스를 사용하면 바인딩이 바인딩된 객체에 단일 리스너를 연결하여 그 객체에 대한 모든 속성의 변경 사항을 수신할 수 있습니다.

한마디로 값이 변경되면 감지해서 알아서 변경되어야 하는 곳을 변경시켜 준다. 뭐 이런 말이죠.

예를 들어 닉네임이 '알통몬'이었는데 '근육몬'으로 변화가 되었다면 변화를 감지해서

기존에 '알통몬'이라는 값이 들어갔던 곳에 '근육몬'이라는 값으로 대치해준다는 뜻입니다.


즉,

어떠한 데이터가 변경되었을 때 자바(코틀린) 코드로 변경되어야 할 곳(xml과 연동되는 값)을 찾아

데이터를 변경시켜주지 않아도 Observable이 감지하여 알아서 변경해줍니다.


예제 소스.

먼저 DataBinding 사용을 위해

앱 레벨 gradle에 속성을 추가해줍니다.

android {
compileSdkVersion 28
defaultConfig {
applicationId "al.tong.mon.databindingobservable"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

dataBinding {
enabled true
}

}


그리고 감지할 데이터가 있어야겠죠?

BaseObservable을 상속받는 Data Class 를 하나 만들어 줍니다.

저는 이름과 별명 값을 가지는 클래스로 만들었습니다.

package al.tong.mon.databindingobservable;

import android.databinding.BaseObservable;
import android.databinding.Bindable;

public class ObservableItem extends BaseObservable {

private String name;
private String nickName;

@Bindable
public String getName() {
return name;
}

@Bindable
public String getNickName() {
return nickName;
}

public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}

public void setNickName(String nickName) {
this.nickName = nickName;
notifyPropertyChanged(BR.nickName);
}
}


코드를 보시면 못보던 값들이 있을텐데요.

@Bindable 어노테이션과

notifyPropertyChanged(...);

입니다.

@Bindable은

변화를 갑지하고자하는 getter 위에 사용하면 되고

notifyPropertyChanged는 예제 코드처럼 setter에 사용하면 됩니다.

[ 광고 보고 가시죠! ]



[ 감사합니다! ]


activity_main.xml

TextView가 2개 있고

ObservableItem을 binding 해주었습니다.

첫 번째 TextView는 ObservableItem의 name 값을 받아 setText하고

두 번째 TextView는 ObservableItem의 nickName 값을 받아 setText합니다.

<?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="item"
type="al.tong.mon.databindingobservable.ObservableItem" />

</data>

<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:id="@+id/nameTxtView"
android:text="@{item.name}"
android:textSize="40sp"
android:textColor="@android:color/black"
android:gravity="center"
tools:text="asdasd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/nameTxtView"
android:id="@+id/nickNameTxtView"
android:text="@{item.nickName}"
android:textSize="40sp"
tools:text="asdasd"
android:textColor="@android:color/black"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />


</android.support.constraint.ConstraintLayout>
</layout>

MainActivity.java

package al.tong.mon.databindingobservable;

import android.databinding.DataBindingUtil;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import al.tong.mon.databindingobservable.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

ActivityMainBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
final ObservableItem item = new ObservableItem();
item.setName("박성균");
item.setNickName("알통몬");
binding.setItem(item);

new Handler().postDelayed(new Runnable() {
@Override
public void run() {
item.setName("박이레");
item.setNickName("근육몬");
}
}, 3000);
}
}

MainActivity.java 를 보면 직접적으로 TextView의 값을 변경하는 코드가 없이

액티비티가 실행되고 3초 후에

Observable을 상속받는 ObservableItem의 setName("") 과 setNickName("")만 해줬는데요.

실행해보면 액티비티 실행 후 3초후 TextView의 값들이 변경되는 걸 확인할 수 있습니다.

깃허브 소스코드.

https://github.com/Parksunggyun/DataBindingObservable

이상입니다.

감사합니다.

반응형