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
。
所以我有:
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
。