Kotlin Ошибка при настройке привязки данных - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь раздуть фрагмент формы сцены в моем MainActivity, а также сделать ставку на данные. Я получаю это сообщение об ошибке:

Сообщение об ошибке

Caused by: android.view.InflateException: Binary XML file line #27: Binary XML file line #27: Error inflating class fragment
 Caused by: android.view.InflateException: Binary XML file line #27: Error inflating class fragment
 Caused by: java.lang.IllegalArgumentException: Binary XML file line #27: Duplicate id 0x7f0800bc, tag null, or parent id 0x7f08007d with another fragment for com.google.ar.sceneform.ux.ArFragment
...
at com.test.test.view.MainActivity.setupDataBinding(MainActivity.kt:54)

Это мой MainActivity.kt

private fun setupDataBinding() {
    val binding: ActivityMainBinding =
        DataBindingUtil.setContentView(this, R.layout.activity_main)
    binding.lifecycleOwner = this
    binding.viewmodel = viewModel // Injecting the view model into the layout file
}

activity_main. xml

<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".view.MainActivity">

<data>
    <variable
        name="viewmodel"
        type="com.test.test.viewModel.MainActivityViewModel"/>
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <FrameLayout
        android:id="@+id/frame_sceneform_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <fragment
            android:id="@+id/sceneform_fragment"
            android:name="com.google.ar.sceneform.ux.ArFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </FrameLayout>
    <Button
        android:id="@+id/btnOpenMenu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:onClick="@{() -> viewmodel.openCloseMenu()}"
        android:text="@{viewmodel.btnOpenMenuText}"
        app:layout_constraintEnd_toEndOf="@+id/frame_sceneform_fragment"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Кто-нибудь видел это раньше и знает решение?

1 Ответ

1 голос
/ 02 февраля 2020

Если вы используете <fragment>, ваш id должен быть уникальным для всей вложенной деятельности. Это отличается от обычного представления в ресурсе макета, где мы можем иметь их несколько с одинаковым значением id (например, строки в RecyclerView).

В вашем случае вы были раздувая компоновку дважды, и, таким образом, вторая инфляция вызвала столкновение, при котором у вас была секунда <fragment> с тем же id.

Если вы используете привязку данных, DataBindingUtil.setContentView() раздувает компоновку и вызывает setContentView() о вашей деятельности. Вам не нужен традиционный setContentView(), и в вашем случае оба они привели к столкновению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...