안드로이드 뷰모델(ViewModel)

김성준·2022년 2월 26일
0

안드로이드

목록 보기
9/16

안드로이드 공식문서의 내용을 정리한 자료입니다.

뷰모델(ViewModel)

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)
    }
}
profile
수신제가치국평천하

0개의 댓글