전 글에서는 간단하게 Activity에서의 ViewModel 사용을 해보았다.
이번 글에서는 먼저 Fragment에서 ViewModel을 사용해보자!
val transaction = manager.beginTransaction()
val fragment = TestFragment()
transaction.replace(R.id.frameArea, fragment)
transaction.addToBackStack(null)
transaction.commit()
먼저 fragment layout을 만들고, 위의 코드와 같이 액티비티에서 framlayout을 형성하여 fragment로 변환해준다.
class TestFragmentViewModel : ViewModel() {
var countValue = 0
fun plus(){
countValue++
}
fun minus(){
countValue--
}
}
그리고 전 글과 똑같이 ViewModel을 만들어주고,
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container, false)
viewmodel= ViewModelProvider(this).get(TestFragmentViewModel::class.java)
binding.resultArea.text = viewmodel.countValue.toString()
binding.plus.setOnClickListener {
viewmodel.plus()
binding.resultArea.text = viewmodel.countValue.toString()
// countValue++
// binding.resultArea.text = countValue.toString()
}
binding.minus.setOnClickListener {
viewmodel.minus()
binding.resultArea.text = viewmodel.countValue.toString()
// countValue--
// binding.resultArea.text = countValue.toString()
}
액티비티에서의 ViewModel을 사용했던 것처럼 똑같이 코드를 구현하였다.
하지만 ViewModel은 액티비티의 라이프사이클을 고려하기 때문에 데이터가 또 다시 초기화되는 문제가 발생했다.
이는 savedInstanceState 를 사용하여 문제를 해결할 수 있다!!!
if(savedInstanceState == null){
val transaction = manager.beginTransaction()
val fragment = TestFragment()
transaction.replace(R.id.frameArea, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
이 방법 이외에도 액티비티하고 프래그먼트에서 ViewModel을 공유하여 데이터를 보존하는 방법이 있다!
Activity/Fragment 의 ViewModel 공유
먼저 dependencies에 다음을 추가하자.
implementation 'androidx.fragment:fragment-ktx:1.5.1'
그리고 초록색의 frame_layout을 만들어주고, 액티비티에서의 ViewModel 값이 프래그먼트에서도 공유가 되는지 확인해보자!
MainActivity클래스에서 똑같이 버튼을 만들어주고, Fragment클래스에서 다음과 같이 viewmodel을 추가해준다.
private lateinit var binding : FragmentTestBinding
private val viewModel : MainViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container, false)
binding.fragmentTest.text = viewModel.getCount().toString()
// Inflate the layout for this fragment
return binding.root
}
화면을 돌려도 fragment에서도 데이터가 유지되는 것을 확인할 수 있다!!
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] LiveData (0) | 2022.08.17 |
---|---|
[JETPACK개론] ViewModelFactory (0) | 2022.08.16 |
[JETPACK개론] ViewModel ? (0) | 2022.08.11 |
[JETPACK개론] View,DataBinding + Adapter (0) | 2022.08.10 |
[JETPACK개론] DataBinding 과 data class (0) | 2022.07.26 |