Я использую ViewModel и Livedata. Я попытался получить текущую позицию ViewPager в ViewModel с помощью следующего кода
<android.support.v4.view.ViewPager
android:id="@+id/moveFromPlansViewPager"
android:layout_width="0dp"
android:layout_height="72dp"
android:layout_marginTop="16dp"
android:clipToPadding="false"
android:selectedItemPosition="@={ viewModel.selectedPos }"
android:paddingStart="16dp"
android:paddingEnd="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/moveFromHeaderTextView" />
Внутри ViewModel у меня есть
var selectedPos: MutableLiveData<Int> = MutableLiveData()
И я нахожу значение в выбранной позиции и сравниваю его со значением в EditText. Почему-то я считаю эту логику правильной. Но проблема в то время как
android:selectedItemPosition="@={ viewModel.selectedPos }"
Когда я добавляю эту строку в макет, это вызывает ошибку привязки данных.
e: [kapt] Возникла исключительная ситуация: android.databinding.tool.util.LoggedErrorException: Обнаружены ошибки привязки данных.
Кто-нибудь может мне помочь???
Погружаясь глубже в ошибку, она показывает что-то вроде:
****/ data binding error ****msg:Cannot find the getter for attribute 'android:selectedItemPosition' with value type java.lang.Integer on android.support.v4.view.ViewPager ****\ data binding error ****
Практически это означает, что этот конкретный атрибут не может быть связан из коробки (и вы не можете использовать его как этот android:selectedItemPosition="2"
, f.ex.)
Есть пара альтернатив
Сделайте это по-старому: попросите наблюдателя для MutableLiveData
selectedPos
во фрагменте, а затем просто выполните обновление там вручную:
viewModel.selectedPos.observe(this, Observer { position ->
position?.let { moveToSavingsPlansViewPager.setCurrentItem(it, true) }
})
Первый более продвинутый, второй легче запустить. Так что решать вам.