Viewpager2 FragmentStateAdapter leak
See original GitHub issueHi,
I implement a basic viewpager2
My main fragment (which contain a viewpager of 2 fragments (fragmentA and fragment B))
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
my_view_pager.adapter = MyAdapter(activity, args.refBrand)
TabLayoutMediator(my_tab_layout, view_pager) { tab, position ->
tab.text = if(position == 0) "1" else "2"
}.attach()
}
...
Adapter :
class MyAdapter : FragmentStateAdapter(fragmentActivity) {
override fun getItemCount(): Int = 2
override fun createFragment(position: Int): Fragment = when (position) {
0 -> FirstFragment.newInstance(filter = true)
1 -> Second.newInstance(filter = false)
else -> throw IllegalArgumentException...
}
}
The FragmentStateAdapter is leaking.
Like my others screens without viewpagers I tried
override fun onDestroyView() {
super.onDestroyView()
my_view_pager.adapter = null
}
But it crash when I go to another fragment destination from fragmentA (or B) and come back :
E/AndroidRuntime: FATAL EXCEPTION: main Process: app, PID: 30471 java.lang.IllegalStateException: Fragment no longer exists for key f#0: unique id 7ee10572-a2f6-4e46-8227-daaad57fd649 at androidx.fragment.app.FragmentManager.getFragment(FragmentManager.java:772) at androidx.viewpager2.adapter.FragmentStateAdapter.restoreState(FragmentStateAdapter.java:549) at androidx.viewpager2.widget.ViewPager2.restorePendingState(ViewPager2.java:350) at androidx.viewpager2.widget.ViewPager2.dispatchRestoreInstanceState(ViewPager2.java:375) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) at android.view.View.restoreHierarchyState(View.java:19793) at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:573) at androidx.fragment.app.FragmentStateManager.restoreViewState(FragmentStateManager.java:356) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1189) at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849) at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Can you help? Thanks
Issue Analytics
- State:
- Created 3 years ago
- Reactions:21
- Comments:14
Top GitHub Comments
I use this constructor with fragment.viewLifecycleOwner.lifecycle and set adapter to null when onDestroyView.
Just create adapter with Fragment: FragmentStateAdapter(fragment)
Don’t use FragmentStateAdapter(fragmentActivity)