Это перевод третьей части из цикла об интеграции ViewModel c Koltin Coroutines, Data Binding и Navigation.
Чтобы более тесно на практике познакомиться с этими компонентами, записывайтесь на продвинутый курс по разработке приложения “Чат-мессенжер”
ViewModel и LiveData в Data Binding
Добавлено в Android Studio 3.1
Для Java и Kotlin
Весь этот шаблон LiveData
Эта интеграция стара, но хороша. ViewModel обычно содержат LiveData, и LiveData предназначена для наблюдения. Обычно это означает добавление наблюдателя во фрагмент:
override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) myViewModel.name.observe(this, { newName -> // Update the UI. In this case, a TextView. nameTextView.text = newName }) }
Библиотека Data Binding предназначена для наблюдения за вашими данными и обновления пользовательского интерфейса. Используя ViewModel, LiveData и Data Binding вместе, вы можете удалить предыдущий код наблюдения LiveData и ссылаться на ваши ViewModel и LiveData прямо из XML-макета.
Использование Data Binding, ViewModel и LiveData
Допустим, в вашем XML-макете вы хотите сослаться на вашу ViewModel:
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="viewmodel" type="com.android.MyViewModel"/> </data> <... Rest of your layout ...> </layout>
Чтобы использовать LiveData с Data Binding, вам просто нужно вызвать binding.setLifecycleOwner (this), а затем передать вашу ViewModel привязке, например так:
class MainActivity : AppCompatActivity() { // This ktx requires at least androidx.activity:activity-ktx:1.0.0 private val myViewModel: MyViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //Inflate view and create binding val binding: MainActivityBinding = DataBindingUtil.setContentView(this, R.layout.main_activity) //Specify this activity as the lifecycleOwner for Data Binding binding.lifecycleOwner = this // Pass the ViewModel into the binding binding.viewmodel = myViewModel } }
Теперь в вашем макете вы можете использовать вашу ViewModel. Как видно ниже, я установил текст в viewmodel.name:
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="viewmodel" type="com.android.MyViewModel"/> </data> <TextView android:id="@+id/name" android:text="@{viewmodel.name}" android:layout_height="wrap_content" android:layout_width="wrap_content"/> </layout>
Обратите внимание, что viewmodel.name может быть строкой или LiveData. Если это LiveData, пользовательский интерфейс будет обновляться при каждом изменении LiveData.
Вопросы о какой-либо из этих функций? Оставьте комментарий! Спасибо за прочтение!
Продолжение следует