app 수준 gradle의 plugins에 >> id 'kotlin-kapt' << 추가해줘야함
[BindingAdapter] 안드로이드 DataBinding에 BindingAdapter 사용법
class MainActivity2 : AppCompatActivity() {
private lateinit var binding: ActivityMain2Binding
val liveText = MutableLiveData<String>()
val liveVisible = MutableLiveData<Boolean>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main2)
binding.apply {
lifecycleOwner =
this@MainActivity2 // **중요** binding에 LifeCycleOwner을 지정해줘야 LiveData가 실시간으로 변화
activity = this@MainActivity2 // xml 파일에 선언한 activity
}
binding.btnChange1.setOnClickListener {
liveVisible.value = true
}
binding.btnChange2.setOnClickListener {
liveVisible.value = false
}
liveText.value = "Hello DataBinding"
}
}
<?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="activity"
type="com.example.mutablelivedata.MainActivity2" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{activity.liveText}"
**app:visible**="@{activity.liveVisible}"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/btn_change1"
app:layout_constraintVertical_chainStyle="packed"/>
<Button
android:id="@+id/btn_change1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="visible"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_view"
app:layout_constraintBottom_toTopOf="@id/btn_change2"/>
<Button
android:id="@+id/btn_change2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_change1"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
object DataAdatper {
/**
* View의 visibility를 변경
* @param view 속성을 사용하는 view
* @param isVisible visibility를 변경시키는 기준이 되는 값
*/
@JvmStatic
@BindingAdapter("visible")
fun setVisible(view: View, isVisible: Boolean) {
view.visibility = if (isVisible) View.VISIBLE else View.GONE
}
}