Android

[Android] 양방향 DataBinding

2023. 2. 9. 20:47
반응형

ViewModel & DataBinding

 

이전의 DataBinding은 앱의 뷰와 간접적으로 연결을 하고 있었습니다.

이제는 DataBinding을 View Model에 직접적으로 연결 할것입니다.

 

 

package com.anushka.viewmodeldemo1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.anushka.viewmodeldemo1.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var viewModel: MainActivityViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        viewModel = ViewModelProvider(this)[MainActivityViewModel::class.java]

        binding.myViewModel = viewModel
        
        viewModel.count.observe(this, Observer {
        	binding.countText.text = it.toString()
        })
    }
}

 

 

이런식으로 작성을 한다면 MainActivity의 onclicklistener 코드 부분을 제거할 수 있습니다.

 

이것이 DataBinding과 함께 onClickListener와 같은 이벤트 리스너를 사용하는 방법입니다.

 

LiveData & DataBinding

 

이번에는 LiveData의 observer 코드 부분을 제거할 것입니다.

 

 

지금 사용하고있는 것은 Int값입니다.

텍스트에 숫자를 표시하려면 int값을 String값으로 변환해야 합니다. 따라서 String.valueOf를 사용했습니다.

 
 

이제 MainActivity에 Viewmodel 객체에 실제 생명 주기 소유자를 제공해야합니다.

 
package com.anushka.viewmodeldemo1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.anushka.viewmodeldemo1.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var viewModel: MainActivityViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        viewModel = ViewModelProvider(this)[MainActivityViewModel::class.java]

        binding.lifecycleOwner = this

        binding.myViewModel = viewModel

    }
}
 

이제 Observer 부분은 필요하지 않습니다.

 

 

양방향 DataBinding

객체의 값이 변경되면 UI가 변경되고 UI가 변경되면 값이 변경됩니다. 변경 사항은 양방향으로 자동 업데이트됩니다.

 

MainViewModel

package com.example.twowaydemo1

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MainActivityViewModel : ViewModel() {

    val userName = MutableLiveData<String>()

    init {
        userName.value = "홍길동"
    }
}

 

레이아웃 파일

<?xml version="1.0" encoding="utf-8"?>
<layout>

    <data>

        <variable
            name="viewModel"
            type="com.example.twowaydemo1.MainActivityViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout 
        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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <EditText
            android:id="@+id/editText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:textSize="40sp"
            android:text="@={viewModel.userName}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.294" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.userName}"
            android:textSize="40sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
 

EditText의 @{} 사이에 = 를 추가 하게되면 이것이 양방향 DataBinding이 동작하는 방식입니다.

 

MainActivity

package com.example.twowaydemo1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.twowaydemo1.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding : ActivityMainBinding
    private lateinit var viewModel: MainActivityViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        viewModel = ViewModelProvider(this)[MainActivityViewModel::class.java]

        binding.viewModel = viewModel
        binding.lifecycleOwner = this
    }
}
 
 

 

변경되는 것을 확인할 수 있습니다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'Android' 카테고리의 다른 글

[Android] Coroutines  (0) 2023.03.21
[Android] Lottie Splash  (0) 2023.02.24
[Android] LiveData  (0) 2023.02.06
[Android] ViewModel  (0) 2023.02.04
[Android] DataBinding  (0) 2023.01.29
'Android' 카테고리의 다른 글
  • [Android] Coroutines
  • [Android] Lottie Splash
  • [Android] LiveData
  • [Android] ViewModel
yunJaem06
yunJaem06
yunJaem06
비바윤
yunJaem06
전체
오늘
어제
  • 전체 (147)
    • Algorithm (121)
      • [알고리즘]BACKJOON - Java&Kotli.. (98)
      • Java알고리즘 문제풀이 & Kotlin (23)
    • Kotlin (4)
    • Android (17)
    • CS (1)
      • 소프트웨어공학 (1)
      • 운영체제 (0)
      • 컴퓨터구조 (0)
    • 내가 좋아하는 맛집 :) (0)
    • 다시 볼만한 영화 & 드라마 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • Kotiln
  • ViewModel
  • ViewModelFactory
  • 안드로이드
  • Android
  • lottie
  • 알고리즘
  • 라이브러리
  • 생명주기
  • kotlin
  • 1장
  • zxing
  • 캡슐화
  • Kotlin In Action
  • 특정 문자 뒤집기
  • 가위 바위 보
  • MutableLiveData
  • 양방향
  • DataBinding
  • Lifecycle
  • Livedata
  • reversed
  • 배열
  • Java
  • qr
  • 3장
  • 중복문자제거
  • AndroidViewModel
  • splash화면
  • 코틀린

최근 댓글

최근 글

hELLO · Designed By 정상우.
yunJaem06
[Android] 양방향 DataBinding
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.