DataBinding 과 BindingApdater

2023. 1. 16. 15:37Android 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