I referred to AndroidViewModelFactory class and use it like this
1.AndroidViewModelFactory
class AndroidViewModelFactory private constructor(
private val mApplication: Application,
private val mName: String
) : ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return if (AndroidViewModel::class.java.isAssignableFrom(modelClass)) {
try {
modelClass.getConstructor(
Application::class.java, String::class.java
).newInstance(mApplication, mName)
} catch (e: Exception) {
throw RuntimeException("Cannot create an instance of $modelClass", e)
}
} else super.create(modelClass)
}
companion object {
private var sInstance: AndroidViewModelFactory? = null
fun getInstance(
application: Application,
name: String
): AndroidViewModelFactory {
if (sInstance == null) {
sInstance = AndroidViewModelFactory(application, name)
}
return sInstance as AndroidViewModelFactory
}
}
}
2.ViewModelFactory
object ViewModelFactory {
fun <T : ViewModel?> createViewModel(
activity: FragmentActivity,
application: Application,
name: String,
cls: Class<T>?
): T {
return ViewModelProvider(
activity,
AndroidViewModelFactory.getInstance(application, name)
).get(cls!!)
}
}
3.NameViewModel
class NameViewModel(application: Application, name: String) : AndroidViewModel(application) {
val name = ObservableField<String>()
init {
this.name.set(name)
}
}
4.NameActivity
class NameActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding =
DataBindingUtil.setContentView(this, R.layout.activity_name) as ActivityNameBinding
val viewModel = ViewModelFactory.createViewModel(
this,
application,
"AndroidViewModel",
NameViewModel::class.java
)
binding.viewModel = viewModel
}
}
5.activity_name
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="cn.eli.demo.viewmodel.NameViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".viewmodel.NameActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="@{viewModel.name}"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>