viewPager 2 和 TabLayout 不再存在片段

Fragment no longer exists with viewPager 2 and TabLayout

所以我有:

Fragment A:这里有一个 viewPager2 和 TabLayout,带有 2 个选项卡,Fragment B 和 C。

然后在 Fragment B 中,我有一个按钮可以转到 TabLayout 之外的 Fragment D,在那里我想获取一些数据,返回并在 Fragment B 中填充 TextView片段 A.

中的 TabLayout

它工作正常,直到我在片段 D 上并尝试返回片段 B 并获得 Fragment no longer exists for key f#0

我该如何解决这个问题?

片段 A TabLayout 适配器:

private inner class ScreenSlidePagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
    override fun getItemCount(): Int = 2

    override fun createFragment(position: Int): Fragment {
        return if (position == 0) FragmentB()
        else FragmentC()
    }
}

片段 B:

findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<String>("key")?.observe(
        viewLifecycleOwner) { result ->
        binding.textView.text = result
    }

片段 D:

fun onGoBack(data: String){
    findNavController().apply {
                    previousBackStackEntry?.savedStateHandle?.set("key", data)
                    navigateUp()
                }
}

主要活动onSupportNavigateUp:

override fun onSupportNavigateUp(): Boolean {
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}

导航图:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/navigation"
app:startDestination="@id/fragmentA">

<fragment
    android:id="@+id/fragmentA"
    android:name="com.example.FragmentA"
    android:label="Fragment A" />

<fragment
    android:id="@+id/fragmentB"
    android:name="com.example.FragmentB"
    android:label="FragmentB" />

<fragment
    android:id="@+id/fragmentC"
    android:name="com.example.FragmentC"
    android:label="FragmentC" />

<fragment
    android:id="@+id/fragmentD"
    android:name="com.example.FragmentD"
    android:label="FragmentD" />
</navigation>

您不应该将 ViewPager 页面碎片添加到 NavGraph 中,它不仅会引入内存泄漏,而且还会为 navGraph 引入 IllegalStateException..查看 了解更多详情。

但是你可以做些什么来解决这个问题:

从导航图中删除寻呼机 B 和 C 片段。所以 navGraph 现在包含 A & D

由于片段 B 不是 navGraph 的一部分,通过片段 A 进行从片段 B 到 D 的所需导航:

在片段 B 中:

val fragmentA: FragmentA = requireParentFragment() as FragmentA
fragmentA.openFragmentD()

在片段 A 中:

fun openFragmentD() {
    val  navHostFragment: NavHostFragment = ...;
    val navController: NavController = navHostFragment.getNavController()
    navController.navigate(FragmentADirections.actionFragmentAToFragmentD())
}

同样:因为你需要return一些数据从D返回到B

然后通过Fragment A接收这个数据onCreateView()

val data = FragmentAArgs.fromBundle(getArguments())

现在可以很容易地使用新数据更新 ViewPager 片段 B,或者您可以在片段之间共享 ViewModel