rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

android開発 ViewModelを引数付きで生成・初期化する

2021 Aug. 29.
2021 Aug. 28.

概要

  1. ViewModelを継承した引数付きクラスを定義する

  2. ViewModelProvider.Factoryを継承した、ViewModelの引数付きインスタンスを生成するためのクラスを定義する

  3. MainActivity内でViewModelProvider.Factoryの前記サブクラスのインスタンスを生成する


サンプル

SampleViewModel.kt
import androidx.lifecycle.ViewModel

class SampleViewModel(val user: String, val password: String): ViewModel() {
    // 以下にViewModel内の動作コードを記述する

}


SampleViewModelFactory.kt
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider

class SmbViewModelFactory(val user: String, val password: String): ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return SmbViewModel(user, password) as T
    }
}


MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider

class MainActivity : AppCompatActivity() {
    val user: String = "foo"
    val password: String = "pass"

    lateinit var sampleViewModel: SampleViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // get ViewModel
        val sampleViewModelFactory = SampleViewModelFactory(user, password)
        sampleViewModel = ViewModelProvider(this, sampleViewModelFactory).get(SampleViewModel::class.java)
    }
}