【问题标题】:android MapView + ViewPager2 + DataBinding issueandroid MapView + ViewPager2 + DataBinding 问题
【发布时间】:2019-08-14 12:54:11
【问题描述】:

我最近遇到了一个非常奇怪的问题。 我的布局中有一个地图视图,它使用数据绑定进行了膨胀。 在我将 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.

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

  • 如果我从布局中删除 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 { }
}
}

示例布局:

<?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>

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

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

【问题讨论】:

  • 您好,您找到问题的原因了吗?这个问题让我抓狂:S
  • @lelloman,我想我最终使用了旧的查看器。很高兴看到您找到了不同的解决方案:)
  • 遇到了同样的问题,请问您找到解决方案了吗?目前我看到的唯一解决方案是使用 ViewPager 而不是 ViewPager2 ...
  • 奇怪,当我将 viewPager2 放在地图后面时,它可以工作,但是由于 mapView 覆盖了 VP2...

标签: android android-mapview android-databinding android-viewpager2


【解决方案1】:

问题似乎在于MapViewViewPager2 都膨胀视图并为它们分配动态生成的ID。

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

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

我目前正在通过以下方式解决这种不幸的情况:

for(i in 0 until 1000) ViewCompat.generateViewId()

setContentView(Int) 之前Activity

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2020-11-30
    • 1970-01-01
    • 2020-06-15
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多