片段未在后台堆栈中注册

Posted

技术标签:

【中文标题】片段未在后台堆栈中注册【英文标题】:Fragment doesn't register in backstack 【发布时间】:2021-04-09 13:11:41 【问题描述】:

我有以下方法

// 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()

我在我的一个片段中使用它 -


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
        
    

问题是,当我在“InspectionDetailsFragment”层的一个顶部实例化另一个片段并按回时,它会直接返回到“InspectionFragment”父级。

我不明白为什么会这样。

有人有想法吗?

【问题讨论】:

【参考方案1】:

当您调用 changeFragment 函数时,您将 true 作为最后一个参数传递:

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

在changeFragment函数中:

if (addToBackStack) fragmentTransaction.addToBackStack(null)

它不会被添加到 backStack。我认为您应该将 String 值作为要使用的 backStack 的名称传递,而不是 null。

我对此不是 100% 确定的。您可以从此处阅读有关片段事务的更多信息:https://developer.android.com/guide/fragments/transactions

【讨论】:

以上是关于片段未在后台堆栈中注册的主要内容,如果未能解决你的问题,请参考以下文章

将新片段添加到后台堆栈是不是会暂停当前片段?

从后台堆栈恢复片段时的 savedInstanceState

在后台堆栈中保持片段视图运行

在后台堆栈中多次防止相同的片段

如何从后台弹出片段

添加到后台堆栈时如何保持片段状态?