반응형
Notice
Recent Posts
Recent Comments
Link
불로구
안드로이드 스튜디오 - dataBinding 본문
반응형
데이터 바인딩이란?
- 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
}
}
반응형
'프로그래밍 > 코틀린 안드로이드' 카테고리의 다른 글
안드로이드 스튜디오 - MVC 패턴이란? (0) | 2021.04.23 |
---|---|
안드로이드 - 내가보려고 다시쓰는 Kotlin 라이브데이터(LiveData) (0) | 2021.04.22 |
안드로이드 스튜디오 - Activity 와 Fragment간 데이터 주고 받기 (0) | 2021.04.21 |
안드로이드 스튜디오 - 코틀린 쓰레드 & runOnUiThread (0) | 2021.04.20 |
코틀린 MVP패턴 아키텍쳐 (1) - 이론 (0) | 2021.04.20 |
Comments