[英]android MapView + ViewPager2 + DataBinding issue
我最近遇到了一個非常奇怪的問題。 我的布局中有一個地圖視圖,它使用數據綁定進行了膨脹。 在我將 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.
但只有當您第一次打開第一個片段並轉到下一個片段然后按回時才會發生這種情況。
它似乎與視圖狀態有關,但我能做些什么來解決這個問題嗎?
這是一個示例片段代碼:
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 也有幫助,因此仍然可以使用數據綁定。
問題似乎是MapView
和ViewPager2
都膨脹視圖並為它們分配動態生成的 id。
ViewPager2
(版本 1.0.0 atm)通過調用ViewCompat.generateViewId()
來做到這一點,我不知道MapView
在做什么,它沒有使用LayoutInflater
來膨脹其子視圖,我懷疑它也沒有調用ViewCompat.generateViewId()
。
問題的原因是視圖層次結構最終包含 2 個具有相同 id 的View
(對我來說值為1
),一個是 ViewPager2 內的RecyclerView
(直到 ViewPager2 是 RecyclerView 的包裝器,太棒了),另一個是一個在MapView
內包含 2 個ImageView
的LinearLayout
。
我目前正在通過以下方式解決這種不幸的情況:
for(i in 0 until 1000) ViewCompat.generateViewId()
在Activity
中的setContentView(Int)
之前。
問題似乎是viewpager包裝了一個recyclerview,它為其分配了一個ID 1,而mapview分配了相同的ID 1。我解決了這個問題:
viewPager = binding.viewPager
for (view in viewPager.children) {
if (view is RecyclerView) {
view.id = 99999999
break
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.