androidfragmenttransactionfragment-backstack

Fragment doesn't register in backstack


I have the following method

// Change fragment extension function to handle navigation easily
fun changeFragment(fragmentManager: FragmentManager?, @IdRes containerId: Int, fragment: Fragment?, addToBackStack: Boolean = false) {
    if (fragmentManager == null || fragment == null) return
    val fragmentTransaction = fragmentManager.beginTransaction()
    if (addToBackStack) fragmentTransaction.addToBackStack(null)
    fragmentTransaction.replace(containerId, fragment, fragment::class.java.simpleName).commit()
}

and I am using it inside one of my fragments -


class InspectionFragment : Fragment(R.layout.fragment_inspection) {

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        inspectionAdapter = InspectionAdapter { inspection ->
            changeFragment(
                parentFragmentManager, R.id.fragment_inspection_frame_layout,
                InspectionDetailsFragment.newInstance(inspection), true
            )
        }
  }
}



class InspectionDetailsFragment : Fragment() {

    companion object {
        fun newInstance(inspection: Inspection): InspectionDetailsFragment {
            val inspectionDetailsFragment = InspectionDetailsFragment()
            val bundle = Bundle()
            bundle.putParcelable(GeneralConstants.INSPECTION, inspection)
            inspectionDetailsFragment.arguments = bundle
            return inspectionDetailsFragment
        }
    }
}

The thing is that, when I instansiate onetop of the 'InspectionDetailsFragment' layer another fragment and press back, it goes directly back to the 'InspectionFragment' parent.

I can't understand why this is happening.

Anyone has an idea?


Solution

  • When you call changeFragment function, you're passing true as last argument:

    changeFragment(
                parentFragmentManager, R.id.fragment_inspection_frame_layout,
                InspectionDetailsFragment.newInstance(inspection), true
            )
    

    In changeFragment function:

    if (addToBackStack) fragmentTransaction.addToBackStack(null)
    

    It doesn't get added to backStack. Instead of null i think you should pass String value as the name of the backStack you want to use.

    I'm not 100% sure about this. You can read more about fragment transactions from here: https://developer.android.com/guide/fragments/transactions