작성
·
261
0
finish를 통해서 나갔다오니까 값이 저장이 안되어있는데뭐가 문제인가요? 정상적으로 실행은됩니다.
package com.example.practice_viewmodel
import android.util.Log
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
class MyViewModel(
_counter:Int,
private val savedStateHandle: SavedStateHandle
):ViewModel() {
var counter =savedStateHandle.get<Int>(SAVE_STATE_KEY) ?:_counter
fun saveState() {
savedStateHandle.set(SAVE_STATE_KEY,counter)
}
companion object { //saved state는 key,value로 저장하기때문에 필요
private const val SAVE_STATE_KEY = "counter"
}
}
MyViewModel.kt
MyViewModelfactory.kt
package com.example.practice_viewmodel
import android.os.Bundle
import androidx.lifecycle.AbstractSavedStateViewModelFactory
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.savedstate.SavedStateRegistryOwner
import java.lang.IllegalArgumentException
//class MyViewModelFactory(private val Counter:Int) : ViewModelProvider.Factory {
// override fun<T:ViewModel> create(modelClass:Class<T>) : T {
// if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
// return MyViewModel(Counter) as T
// }
// throw IllegalArgumentException("ViewModel not ofund")
// }
//}
class MyViewModelFactory(
private val counter:Int,
owner:SavedStateRegistryOwner,
defaultArgs: Bundle?=null,
):AbstractSavedStateViewModelFactory(owner, defaultArgs) {
override fun <T : ViewModel?> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle
): T {
if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
return MyViewModel(counter,handle) as T
}
throw IllegalArgumentException("Viewmodel class not found")
}
}
mainAcitivty.kt
package com.example.practice_viewmodel
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.lifecycle.ViewModelProvider
import com.example.practice_viewmodel.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private val binding : ActivityMainBinding by lazy {
ActivityMainBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
// val factory = MyViewModelFactory(100)
// //val myViewModel = ViewModelProvider(this, factory).get(MyViewModel::class.java)
// val myViewModel by viewModels<MyViewModel>() {factory}
//
// binding.textview.text = myViewModel.counter.toString()
//
// binding.plusBtn.setOnClickListener {
//
// myViewModel.counter+=1
// binding.textview.text = myViewModel.counter.toString()
//
// }
// binding.minusBtn.setOnClickListener {
//
// myViewModel.counter -=1
// binding.textview.text = myViewModel.counter.toString()
// }
val factory = MyViewModelFactory(100,this)
val myViewModel by viewModels<MyViewModel>() {factory}
binding.textview.text = myViewModel.counter.toString()
binding.plusBtn.setOnClickListener {
myViewModel.counter+=1
binding.textview.text = myViewModel.counter.toString()
myViewModel.saveState()
}
binding.minusBtn.setOnClickListener {
myViewModel.counter -=1
binding.textview.text = myViewModel.counter.toString()
myViewModel.saveState()
}
binding.finish.setOnClickListener {
finish()
}
}
}
답변 1
1
savedstate는 앱이 백그라운드로 들어갔을 때 시스템이 앱을 강제로 중단했을 경우 데이터를 보존하기 위해 사용하는 임시 저장소입니다. finish로 인한 종료시에는 동작하지 않는 사양으로 되어 있습니다.