안드로이드 공식문서의 내용을 정리한 자료입니다.
ViewModel은 Activity 또는 Fragment에 대한 데이터를 준비하고 관리하는 클래스입니다. 또한 나머지 애플리케이션과 Activity/Fragment의 통신을 처리합니다(예: 비즈니스 로직 클래스 호출).
ViewModel은 Activity 또는 Fragment가 구성변경으로 소멸될 때도 소멸되지 않습니다. 새 Activity 또는 Fragment의 인스턴스가 생성되면 다시 기존의 ViewModel과 연결됩니다.
ViewModel의 목적은 Activity 또는 Fragment에 필요한 정보를 획득하고 유지하는 것입니다. Activity 또는 Fragment는 ViewModel의 변경 사항을 관찰할 수 있어야 합니다. ViewModel은 일반적으로 LiveData 또는 Android 데이터 바인딩을 통해 이 정보를 노출합니다. 또한 선호하는 프레임워크의 observability construct를 사용할 수도 있습니다.
ViewModel의 유일한 책임은 UI에 대한 데이터를 관리하는 것입니다. 뷰 계층 구조에 액세스하거나 Activity 또는 Fragment에 대한 참조를 다시 보유해서는 안 됩니다.
ViewModel을 사용한 예제
TitleFragment
package com.example.viewmodelprac
...
class TitleFragment : Fragment() {
lateinit var binding: FragmentTitleBinding
lateinit var viewModel: TitleViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
binding = DataBindingUtil.inflate(
inflater, R.layout.fragment_title, container, false
)
viewModel = ViewModelProvider(this).get(TitleViewModel::class.java)
viewModel.currentNumb.observe(viewLifecycleOwner, Observer { newNumb ->
binding.numText.text = newNumb.toString()
})
binding.UpBtn.setOnClickListener { viewModel.onUp() }
binding.button.setOnClickListener { view : View ->
view.findNavController().navigate(R.id.action_titleFragment_to_nextFragment)
}
return binding.root
}
}
TitleViewModel
package com.example.viewmodelprac
...
class TitleViewModel : ViewModel() {
private var _currentNumb = MutableLiveData<Int>()
val currentNumb: LiveData<Int> get() = _currentNumb
init {
_currentNumb.value = 0
}
fun onUp() {
_currentNumb.value = (_currentNumb.value)?.plus(1)
}
}