반응형
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을 시켜줄수 있습니다.
반응형
'Android' 카테고리의 다른 글
Activity orientation 상황에서 액티비티 재생성 방지 (0) | 2023.06.10 |
---|---|
안드로이드 해시키 구하는 방법, 카카오 API (2) | 2021.04.12 |
ViewPager2 + TabLayout + RecyclerView (2) | 2021.01.07 |
Android ConstraintLayout 사용법 (0) | 2020.10.21 |
Android 프로젝트 복제 (0) | 2020.10.08 |