Недавно я столкнулся с очень странной проблемой. В моем макете было представление карты, которое было увеличено с помощью привязки данных. После того, как я добавил 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.
Но это происходит только тогда, когда вы сначала открываете первый фрагмент и переходите к следующему, а затем нажимаете назад.
- Если я уберу карту из своего макета, все будет работать.
- Если я уберу 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>
Чтобы воспроизвести, мне нужно открыть другой фрагмент, а затем нажать назад
** РЕДАКТИРОВАТЬ: ** Похоже, что перемещение окна просмотра перед картой также помогает, поэтому привязку данных все еще можно использовать.