前提条件:单Activity架构,一个导航图。
1. Fragment A 拥有一个ViewPager。ViewPager使用FragmentStateAdapter.
2. 通过FragmentStateAdapter实例化 Fragment B(“存在”于ViewPager 中)。
3. 应该从Fragment B导航到Fragment C。--> 这是问题所在。
方法1:ViewPager2+FragmentStateAdapter+从Fragment B中声明的导航
<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
第二种方法:使用ViewPager2 + FragmentStateAdapter + 在Fragment A中声明导航
<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)
第三种方案:ViewPager + FragmentStatePagerAdapter(已弃用)+ 从Fragment B声明导航
与方案一相同的结果。
第四种方案:ViewPager + FragmentStatePagerAdapter(已弃用)+ 从Fragment A声明导航
这个方案实际上是可行的。此外,后退导航也可以正常工作。
问题在于:
- 必须为FragmentB的每个父片段定义导航->不太可扩展
- 使用了已经弃用的适配器
如果有人知道解决这个问题的优雅方法,我会非常感激任何提示。
谢谢