불로구

안드로이드 스튜디오 - dataBinding 본문

프로그래밍/코틀린 안드로이드

안드로이드 스튜디오 - dataBinding

맹이맹이 2021. 4. 22. 16:26
반응형
데이터 바인딩이란?

- UI요소와 데이터를 선언적 방식으로 결합할 수 있게 도와주는 라이브러리

- UI요소에 연결하기 위해 필요한 코드를 최소화 가능

- findViewId 선언 x , 자동

- RecyclerView에 각 item을 자동 set

- data가 바뀌면 자동으로 View 변경 가능

- MVVM & MVP 패턴 구현에 용이

 

준비
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'  //추가
}

android {
	.....
    //추가
    dataBinding {
    	enabled = true
    }
}

// 환경에 따라 다름
 def archLifecycleVersion = '2.2.0'
 implementation "androidx.lifecycle:lifecycle-extensions:$archLifecycleVersion"
 implementation "androidx.lifecycle:lifecycle-compiler:$archLifecycleVersion"
 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$archLifecycleVersion"

 def activity_version = "1.1.0"
 implementation "androidx.activity:activity-ktx:$activity_version"

 

폴더 구조 ( 개인적으로 만든 것 )

 

레이아웃 추가
<?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.databinding.viewmodel.MainViewModel" />
    </data>

    <LinearLayout
        tools.context=".MainActivity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@{viewModel.userName}"
            android:textSize="30dp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            bindPhoneNumber="@{viewModel.phone}"
            android:textSize="30dp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@{viewModel.age}"
            android:textSize="30dp" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{ () -> viewModel.onClickNextUser()}"
            android:text="다음 사람" />
    </LinearLayout>

</layout>

- 데이터 바인딩을 사용하기 위해선 <layout></layout>으로 감싸줘야 하며 <data>를 통해 결합할 객체의 루트 작성

 

viewModel
package com.example.databinding.viewmodel

import androidx.databinding.ObservableField
import androidx.lifecycle.ViewModel

class MainViewModel : ViewModel() {

    var index = -1
    private val userNameList = arrayListOf<String>("홍길동", "박지성", "기성용")
    private val phoneList = arrayListOf<String>("010-1111-1111", "010-2222-2222", "010-3333-3333")
    private val ageList = arrayListOf<String>("25","33","30")

    var userName = ObservableField<String>()
    var phone = ObservableField<String>()
    var age = ObservableField<String>()

    init {
        onClickNextUser()
    }

    fun onClickNextUser(){
        if(index == userNameList.size - 1){
            index = 0
        }else{
            index++
        }
        userName.set(userNameList[index])
        phone.set(phoneList[index])
        age.set(ageList[index])
    }
}

 

어탭터
package com.example.databinding.adapter

import android.widget.TextView
import androidx.databinding.BindingAdapter
import java.lang.StringBuilder

object TextViewBindingAdapter {
    @BindingAdapter("bindPhoneNumber")
    @JvmStatic
    fun TextView.bindPhoneNumber(phone: String){
        this.text = ""
        val builder = StringBuilder()
        builder.append(phone.replace("-","/"))
        this.append(builder.toString())
    }

}

 

메인액티비티
package com.example.databinding

import android.app.Activity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.activity.viewModels
import androidx.databinding.DataBindingUtil
import com.example.databinding.databinding.ActivityMainBinding
import com.example.databinding.viewmodel.MainViewModel
import kotlin.properties.ReadOnlyProperty

class MainActivity : AppCompatActivity() {
    private val viewModel: MainViewModel by viewModels()


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        binding.viewModel = viewModel
    }
}
반응형
Comments