设置数据绑定时的 Kotlin 错误
Kotlin Error When Setting Up Data Binding
我正在尝试在我的 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>
有没有人以前见过这个并且知道解决方案?
如果您使用 <fragment>
,您的 id
对于整个 activity 必须是唯一的。这与布局资源中的普通视图不同,在布局资源中我们可以拥有一堆具有相同 id
值的视图(例如,RecyclerView
中的行)。
在您的例子中,您将布局充气两次,因此第二次 inflation 导致了第二次 <fragment>
与相同 id
.[=19 的碰撞=]
如果您使用数据绑定,DataBindingUtil.setContentView()
会扩充布局并在您的 activity 上调用 setContentView()
。您不需要传统的 setContentView()
,在您的情况下,两者都导致了碰撞。
我正在尝试在我的 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>
有没有人以前见过这个并且知道解决方案?
如果您使用 <fragment>
,您的 id
对于整个 activity 必须是唯一的。这与布局资源中的普通视图不同,在布局资源中我们可以拥有一堆具有相同 id
值的视图(例如,RecyclerView
中的行)。
在您的例子中,您将布局充气两次,因此第二次 inflation 导致了第二次 <fragment>
与相同 id
.[=19 的碰撞=]
如果您使用数据绑定,DataBindingUtil.setContentView()
会扩充布局并在您的 activity 上调用 setContentView()
。您不需要传统的 setContentView()
,在您的情况下,两者都导致了碰撞。