SMALL
1. ViewModel이란?
ViewModel은 간단히 말하면 UI 와 로직의 분리를 위한 개념이다. Activity, Fragment 생명주기의 영향을 받지 않고 가로모드, 세로모드로 변경해도 값이 초기화되지 않고 유지시킬 수 있는게 ViewModel이다. 단, ViewModel에서 context나 activity객체를 사용하고 싶으면 AndroidViewModel()을 사용해야 한다.
2. 앱 gradle 추가
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
3. ViewModel 클래스
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
enum class ActionType {
PLUS, MINUS
}
class MainViewModel: ViewModel() {
companion object {
const val TAG: String = "로그"
}
private val _currentValue = MutableLiveData<Int>()
val currentValue: LiveData<Int>
get() = _currentValue
init {
Log.d(TAG, " MainViewModel - 생성자 호출")
_currentValue.value = 0
}
fun updateValue(actionType: ActionType, input: Int) {
when(actionType) {
ActionType.PLUS ->
_currentValue.value = _currentValue.value?.plus(input)
ActionType.MINUS ->
_currentValue.value = _currentValue.value?.minus(input)
}
}
}
4. MainActivity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.View.OnClickListener
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.example.viewmodel.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity(), OnClickListener {
companion object {
const val TAG: String = "로그"
}
val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
lateinit var mainViewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
mainViewModel.currentValue.observe(this, Observer {
Log.d(TAG, "MainActivity - mainViewModel - CurrentValue 라이브 데이터 값 변경 : ")
binding.tvNumber.text = it.toString()
})
binding.btnPlus.setOnClickListener(this)
binding.btnMinus.setOnClickListener(this)
}
override fun onClick(view: View?) {
if (binding.etNumber.text.toString().isNotEmpty()) {
val userInput: Int = binding.etNumber.text.toString().toInt()
when(view) {
binding.btnPlus ->
mainViewModel.updateValue(actionType = ActionType.PLUS, userInput)
binding.btnMinus ->
mainViewModel.updateValue(actionType = ActionType.MINUS, userInput)
}
}
}
}
LIST
'Kotlin' 카테고리의 다른 글
[Paging] Paging 사용법 (0) | 2023.02.05 |
---|---|
[Paging] Paging이란? (0) | 2023.02.03 |
[LifeCycles] LifeCycles란? (0) | 2023.02.03 |
[Coroutine] Coroutine이란? (0) | 2023.02.02 |
[TIL] Room DB 사용법 (0) | 2023.02.02 |
댓글