본문 바로가기
안드로이드/ViewModel

안드로이드 viewmodel 생성 방법

by 김어찐 2022. 9. 26.
728x90

 

메인 액티비티에서 viewmodel 생성

package com.anushka.viewmodeldemo2

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.anushka.viewmodeldemo2.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var viewModel: MainActivityViewModel
    private lateinit var viewModelFactory: MainActivityViewModelFactory
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        // ViewModelFactory 사용하지않고 ViewModel 생성
        viewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)

        // ViewModelFactory 사용하고 ViewModel 생성
        viewModelFactory = MainActivityViewModelFactory(125)
        viewModel = ViewModelProvider(this,viewModelFactory).get(MainActivityViewModel::class.java)

        binding.resultTextView.text = viewModel.getTotal().toString()

        binding.insertButton.setOnClickListener {
            viewModel.setTotal(binding.inputEditText.text.toString().toInt())
            binding.resultTextView.text = viewModel.getTotal().toString()

        }
    }
}

 

ViewModelFactory

viewModel에서 생성자에 인자값 넣어줘야할시 사용

package com.anushka.viewmodeldemo2

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import java.lang.IllegalArgumentException

class MainActivityViewModelFactory(private val statingTotal : Int) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return super.create(modelClass)
        if(modelClass.isAssignableFrom(MainActivityViewModel::class.java)){
            return MainActivityViewModel(statingTotal) as T
        }
        throw IllegalArgumentException("Unknown View Model Class")
    }


}

 

ViewModel

package com.anushka.viewmodeldemo2

import androidx.lifecycle.ViewModel

class MainActivityViewModel(startingTotal : Int) : ViewModel() {
    private var total = 0

    init {
        total = startingTotal
    }

    fun getTotal():Int{
        return total
    }

    fun setTotal(input:Int){
        total +=input
    }
}

 

fragment-ktx , activity-ktx 사용시 해당 방법으로 생성 가능

build.gradle

  1. implementation 'androidx.activity:activity-ktx:1.3.1'
  2. implementation 'androidx.activity:fragment-ktx:1.3.1'
  1. private val viewModel: MainActivityViewModel by viewModels()
  2. private val viewModel: MainActivityViewModel by activityViewModels()
728x90