DataBinding, LiveData, MVVM 적용해보기

h_hi·2021년 3월 11일
0

환경설정

data binding 을 위해 앱 모듈의 build.gradle 파일을 수정합니다.

dataBinding {
        enabled = true
    }

xml 파일에 <layout> 태그를 추가하여 databinding 을 적용합니다.

<layout ...>
    <data>
        ...
    </data>

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

해당 액티비티에서 binding 클래스 객체를 생성해 주고, LiveData 를 위한 lifeCycleOwner 도 설정합니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding : ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.lifecycleOwner = this
    }
}

ViewModel 생성

View 에서 쓰이는 속성들을 담은 ViewModel 을 생성해 줍니다. 화면전환과 같은 변화에도 데이터가 유지될 수 있도록 AAC ViewModel 도 적용시켜 줍니다.
ViewModel 내에서만 data 를 변경할 수 있도록 private val 로 data 를 선언합니다. 이벤트(input)가 감지되면 ViewModel 내에서 data를 변화시키는 함수를 생성합니다. View 에서 LiveData 를 Observe 하고 있으니 LiveData 에 변화가 있으면 View 에서 이를 파악하고 View 를 갱신합니다.

import androidx.lifecycle.ViewModel

class MainViewModel : ViewModel() {
    private val _signUpEvent = MutableLiveData<Unit>()
    val signUpEvent : LiveData<Unit> = _signUpEvent

    private val _loginEvent = MutableLiveData<Unit>()
    val loginEvent : LiveData<Unit> = _loginEvent

    fun login() {
        _signUpEvent.value = Unit
    }

    fun signUp() {
        _loginEvent.value = Unit
    }
}

DataBinding

ViewModel 변수를 선언해주고, 변화가 감지될 이벤트에 ViewModel의 속성을 DataBinding 해줍니다.

    <data>
        <variable
            name="vm"
            type="com.hhi.tripproject.viewmodel.MainViewModel" />
    </data>
    
    <TextView
            ...
            android:onClick="@{()->vm.signUp()}"
     />

액티비티에서 ViewModel 을 바인딩 해줍니다.

override fun onCreate(savedInstanceState: Bundle?) {
        ...

        vm = MainViewModel()
        binding.vm = vm
    }

binding 된 LiveData를 Observe 하고, 변화된 data 에 따라 View 가 갱신되도록 로직을 설정해 줍니다.

vm.signUp.observe(this, Observer {
            startActivity(Intent(this, SignUpActivity::class.java))
        })

        vm.login.observe(this, Observer {
            startActivity(Intent(this, LoginActivity::class.java))
        })
profile
안드로이드, flutter 개발자

0개의 댓글