6

私は最近、本当に奇妙な問題に遭遇しました。データバインディングを使用して膨らませたレイアウトにマップビューがありました。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 の前にビューページャーを移動することも役立つように思われるため、データバインディングを引き続き使用できます。

4

1 に答える 1