我试图使用ViewPager2 + FragmentStateAdapter +导航组件构建以下视图结构/导航。
先决条件:单一活动体系结构,有一个导航图
1.片段A持有一个视图寻呼机。视图寻呼机使用FragmentStateAdapter。
2.片段B是通过FragmentStateAdapter (视图寻呼机中的“lives”)实例化的。
3.片段C -应该从片段B导航到B->这就是问题所在。
方法1:从片段B声明的ViewPager2 + FragmentStateAdapter +导航
<fragment
android:id="@+id/fragmentA"
android:name="com.abc.FragmentA"
android:label="FragmentA" />
<fragment
android:id="@+id/fragmentB"
android:name="com.abc.FragmentB"
android:label="FragmentB">
<action
android:id="@+id/to_fragmentC"
app:destination="@id/fragmentC" />
</fragment>
<fragment
android:id="@+id/fragmentC"
android:name="com.abc.FragmentC"
android:label="FragmentC" />
FragmentB执行:
FragmentBDirections
.toFragmentC()
.let { findNavController().navigate(it) }
结果:
App crash
java.lang.IllegalArgumentException: navigation destination com.abc:id/to_fragmentC is unknown to this NavController
方法2:从片段A声明的ViewPager2 + FragmentStateAdapter +导航
<fragment
android:id="@+id/fragmentA"
android:name="com.abc.FragmentA"
android:label="FragmentA" >
<action
android:id="@+id/to_fragmentC"
app:destination="@id/fragmentC" />
</fragment>
<fragment
android:id="@+id/fragmentB"
android:name="com.abc.FragmentB"
android:label="FragmentB">
</fragment>
<fragment
android:id="@+id/fragmentC"
android:name="com.abc.FragmentC"
android:label="FragmentC" />
FragmentB执行:
FragmentADirections
.toFragmentC()
.let { findNavController().navigate(it) }
结果:
App navigates to FragmentC, but when i hit the back button , it crashes with :
java.lang.IllegalArgumentException
at androidx.core.util.Preconditions.checkArgument(Preconditions.java:36)
at androidx.viewpager2.adapter.FragmentStateAdapter.onAttachedToRecyclerView(FragmentStateAdapter.java:132)
at androidx.recyclerview.widget.RecyclerView.setAdapterInternal(RecyclerView.java:1209)
at androidx.recyclerview.widget.RecyclerView.setAdapter(RecyclerView.java:1161)
at androidx.viewpager2.widget.ViewPager2.setAdapter(ViewPager2.java:461)
at com.abc.FragmentA.viewCreated(FragmentA.kt:69)
方法3: ViewPager + FragmentStatePagerAdapter (不推荐)+从片段B声明的导航
结果与方法1相同。
方法4:从片段A声明ViewPager + FragmentStatePagerAdapter (不推荐)+导航
这个真的能用。此外,导航回运行良好。
这里的问题是:
必须为不推荐的
如果有人知道这个问题的一些优雅的解决方案,我会很高兴得到任何提示。
谢谢
发布于 2022-01-04 08:12:46
您不需要在图中将片段B声明为目的地,因为您从不使用NavController导航到它。您可以使用目标id来实现片段B中的导航,比如findNavController().navigate(R.id.fragmentC)
,而不是使用操作。findNavController
方法将找到父片段的navController来执行导航。
https://stackoverflow.com/questions/61638513
复制相似问题