Android

BaseObservable을 이용한 inverseBinding

태인킴 2021. 2. 11. 16:38
반응형


 

식별 가능한 데이터 객체 작업  |  Android 개발자  |  Android Developers

식별 가능성은 객체가 데이터 변경에 관해 다른 객체에 알릴 수 있는 기능을 의미합니다. 데이터 결합 라이브러리를 통해 객체, 필드 또는 컬렉션을 식별 가능하게 만들 수 있습니다. 간단한 기

developer.android.com

 

 

1. dataBinding 설정

build.gradle(app) 에서 dataBinding을 설정 합니다.

dataBinding {
	enabled = true
}

 

 

2. kotlin-kapt 설정

코틀린으로 사용하실 경우 build.gradle(app)의 아래 설정도 추가해 주어야 합니다.

apply plugin: 'kotlin-kapt'

 

 

3. BaseObservable 설정

Model 클래스에 BaseObservable을 상속 시켜줘야 합니다.

class User : BaseObservable() {

    @get:Bindable
    var firstName: String = ""
        set(value) {
            field = value
            Log.d("test", "firstName value : ${value}")
            notifyPropertyChanged(BR.firstName)
        }

    @get:Bindable
    var lastName: String = ""
        set(value) {
            field = value
            Log.d("test", "lastName value : ${value}")
            notifyPropertyChanged(BR.lastName)
        }
}

그리고 바인딩을 원하는 변수에 위와 같이 설정해 줍니다. @Bindable 어노테이션을 설정하고, set() 에서 notifyPropertyChanged(BR.변수명)을 설정해 주어야 합니다. BaseObservable을 상속시켜주지 않고 ObservableField<>()로 각각의 변수의 설정하여 사용해도 됩니다.

 

 

4. xml의 layout 설정과 inflate 설정

/* MainActivity.kt */

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.databinding.DataBindingUtil
import com.taein.baseobservabletest.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity(){

    private lateinit var mUser: User

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        (DataBindingUtil.setContentView(this, R.layout.activity_main)
                as ActivityMainBinding)
            .apply {
                mUser = User()
                mUser.firstName = "firstName"
                mUser.lastName = "LastName"
                user = mUser
            }
    }
}
/* activity_main.xml */

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable
            name="user"
            type="com.taein.baseobservabletest.User" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/tv_first_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}"
            app:layout_constraintBottom_toTopOf="@+id/et_last_name"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <EditText
            android:id="@+id/et_last_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@={user.lastName}"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tv_first_name"
            app:layout_constraintBottom_toBottomOf="parent"
            />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

위에서 설정한 User 모델 클래스를 초기화 시켜주고, xml의 대입 시켜 줍니다. xml에서 이를 받아서 바인딩 시켜 줍니다. 그런데 lastName 부분을 잘 보시면, ="@={user.lastName}"을 사용하여 inverseBinding을 설정해 줍니다. 따라서 editText에서 입력하는 데이터가 그대로 lastName의 바인되는 것을 로그로 확인할수 있습니다.

 

만약, RecyclerView의 LiveData<List<Item>> 이와 같은 데이터 포맷으로 adapter의 바인딩 시킨다면, ViewHolder 쪽에서 inverDataBinding을 시키기는 힘들것 입니다. 하지만, 여기서, Item을 BaserObservable로 만들어 준다면, inverseBinding을 시켜줄수 있습니다.

 

 

 

world9604/BaseObservableTest

Contribute to world9604/BaseObservableTest development by creating an account on GitHub.

github.com

 

반응형