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
}
}
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
}
}
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))
})