android MapView + ViewPager2 + DataBinding 问题

SMG*_*ost 6 android android-mapview android-databinding android-viewpager2

我最近遇到了一个非常奇怪的问题。我的布局中有一个地图视图,它使用数据绑定进行了膨胀。在我将 ViewPager2 添加到我的布局后,我遇到了这个问题:

java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class androidx.recyclerview.widget.RecyclerView$SavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/0x1. Make sure other views do not use the same id.
Run Code Online (Sandbox Code Playgroud)

但是只有当您首先打开第一个片段并转到下一个片段,然后按返回时才会发生这种情况。

  • 如果我从我的布局中删除 mapview 一切正常。
  • 如果我从我的布局中删除 viewpager2 一切正常。
  • 如果我删除数据绑定一切正常。

似乎它与视图状态有关,但是我可以做些什么来解决这个问题?

这是一个示例片段代码:

class TestFragment(override val layoutRes: Int = R.layout.fragment_test) : BaseFragment() {

lateinit var binding: FragmentTestBinding

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    binding = FragmentTestBinding.inflate(inflater, container, false)
    setupMap(savedInstanceState)
    return binding.root
}

override fun onResume() {
    super.onResume()
    binding.mapView.onResume()
}

override fun onPause() {
    super.onPause()
    binding.mapView.onPause()
}

private fun setupMap(savedInstanceState: Bundle?) {
    binding.mapView.onCreate(savedInstanceState)
    binding.mapView.onResume()
    binding.mapView.getMapAsync { }
}
}
Run Code Online (Sandbox Code Playgroud)

示例布局:

<?xml version="1.0" encoding="utf-8"?>
<layout>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

要重现我必须打开另一个片段然后按回

**编辑:** 似乎在 mapview 前面移动 viewpager 也有帮助,因此仍然可以使用数据绑定。

lel*_*man 8

问题似乎在于MapViewViewPager2两者都夸大了视图并为它们分配了动态生成的 ID。

ViewPager2(版本 1.0.0 atm)通过调用来做到这一点ViewCompat.generateViewId(),我不知道MapView在做什么,它没有LayoutInflater用来夸大其子视图,我怀疑它也没有调用ViewCompat.generateViewId()

问题的原因是视图层次结构最终包含 2 个View具有相同 id(1对我来说具有值),一个是RecyclerViewViewPager2 内部(直到 ViewPager2 是 RecyclerView 的包装器,太棒了),另一个是LinearLayout包含2ImageViewMapView

我目前正在通过调用来解决这个不幸的情况:

for(i in 0 until 1000) ViewCompat.generateViewId()
Run Code Online (Sandbox Code Playgroud)

之前setContentView(Int)Activity.