Skip to content Skip to sidebar Skip to footer

Viewpager2 Inside A Fragment Leaks After Replacing The Fragment It's In By Navigation Component Navigate

At first, i had the issue for ViewPager2 inside a tab of BottomNavigationView and data binding , data binding also leaks with ViewPager2 and should be nulled in onDestroyView, leak

Solution 1:

Removing adapter from ViewPager2 in onDestroyView method of fragment solved the memory leak issue with FragmentStateAdapter

overridefunonDestroyView() {

        val viewPager2 = dataBinding?.viewPager

        viewPager2?.let {
            it.adapter = null
        }
        super.onDestroyView()
 }

Also set data binding to null in onDestroyView of fragment, i did it in base fragment, which was causing data binding related memory leak. Or use it as mentioned here for viewBinding, it applies to data binding.

privatevar _binding: ResultProfileBinding? = null// This property is only valid between onCreateView and// onDestroyView.privateval binding get() = _binding!!

overridefunonCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

overridefunonDestroyView() {
    super.onDestroyView()
    _binding = null
} 

Note: Fragments outlive their views. Make sure you clean up any references to the binding class instance in the fragment's onDestroyView() method.

Another thing to prevent memory leaks with ViewPager2 inside a fragment is to use viewLifeCycleOwner's lifeCycle which is between onCreateView and onDestroyView instead of this with FragmentStateAdapter as mentioned here.

FragmentManagerfm= getChildFragmentManager();
Lifecyclelifecycle= getViewLifecycleOwner().getLifecycle();
fragmentAdapter = newFragmentAdapter(fm, lifecycle);

Post a Comment for "Viewpager2 Inside A Fragment Leaks After Replacing The Fragment It's In By Navigation Component Navigate"