DataBinding 과 BindingApdater
2023. 1. 16. 15:37ㆍAndroid Jetpack/AAC
- 기존에있던 코드를 이용해서 추가 작성햇습니다.
<?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="viewmodel"
type="com.example.viewmodel.MyViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewmodel.mapCounter.toString()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="증가"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textview" />
/>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="50dp"
android:max="100"
app:layout_constraintBottom_toTopOf="@+id/textview"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:progressScaled="@{viewmodel.liveCounter}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Progress bar 추가해 버튼을 눌렀을 경우에는 viewModel 의 livecounter 메서드를 통해 counter 증가 시켜줬다.
- BindingAdapter 생성
ProgressBar 에 보면,app:progressScaled="@{viewmodel.livecounter}" 를 데이터 바인딩 어댑터를 이용해 적절한 값을 설정하도록 설정 할 수 있다.
- BindingAdapter
package com.example.viewmodel
import android.widget.ProgressBar
import androidx.databinding.BindingAdapter
@BindingAdapter("app:progressScaled")
fun setProgress(progressBar: ProgressBar, counter: Int){
progressBar.progress = counter
}
-> 버튼을 클릭햇을때 progress바가 0에서 counter가 증가함에따라 채워지는걸 볼수있다.
- 이번에는 양방향 데이터바인딩 을 작성해보겟습니다.
<?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="viewmodel"
type="com.example.viewmodel.MyViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewmodel.mapCounter.toString()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="증가"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textview" />
/>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="50dp"
android:max="@{100}"
app:layout_constraintBottom_toTopOf="@+id/textview"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:progressScaled="@{viewmodel.liveCounter}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
프로그래스바에 max = "@{100}",app:progressScaled="@{viewmodel.livecounter}" 를 데이터 바인딩 어댑터를 이용해 적절한 값을 설정하도록 설정 할 수 있다.
package com.example.viewmodel
import android.widget.ProgressBar
import androidx.databinding.BindingAdapter
@BindingAdapter(value = ["app:progressScaled","android:max"], requireAll = true)
fun setProgress(progressBar: ProgressBar, counter: Int, max:Int){
progressBar.progress = (counter*2).coerceAtMost(max)
}
max가 50이되면 프로그래스바가 최대로 채워지는걸볼수있다.
'Android Jetpack > AAC' 카테고리의 다른 글
데이터 바인딩 - Repository pattern 적용해보기. (0) | 2023.02.16 |
---|---|
ViewModel 과 LiveData (0) | 2023.01.12 |
DataBinding 사용법 (0) | 2023.01.12 |
뷰 바인딩 ViewBinding 사용법 (0) | 2022.12.13 |