片段未与片段管理器关联。 (对话片段)

Posted

技术标签:

【中文标题】片段未与片段管理器关联。 (对话片段)【英文标题】:Fragment not associated with a fragment manager. (Dialog Fragment) 【发布时间】:2020-10-03 18:41:35 【问题描述】:

我有一个对话框片段,并且我为延迟初始化创建了一个类。当我显示对话框时,它显示正常。但是,当我关闭对话框时,它崩溃的原因是:Fragment not associated with a fragment manager。

我也尝试过发布Delayed dimiss,但仍然崩溃。

LoadingDialog.kt

class LoadingDialog(private val fm: FragmentManager) : DialogFragment() 

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 
        isCancelable = false
        return inflater.inflate(R.layout.dialog_loading, container, false)
    

    fun showDialog(tag: String? = null) 
        show(fm, tag)
    

    fun closeDialog() 
        dismiss()
    

LazyDialog.kt

class LazyDialog<T : DialogFragment>(private val type: Class<T>, private val fm: FragmentManager) :
    Lazy<T> 
    private var dialog: T? = null

    override val value: T
        get() 
            return when 
                type.isAssignableFrom(LoadingDialog::class.java) -> 
                    LoadingDialog(fm).also 
                        dialog = it as T
                     as T
                
                else -> throw IllegalArgumentException("Unknown class : $type.name")
            
        

    override fun isInitialized(): Boolean = dialog != null

Extensions.kt

inline fun <reified T : DialogFragment> FragmentActivity.loadingDialog(): Lazy<T> 
    return LazyDialog(T::class.java, supportFragmentManager)

LoginActivity.kt

private val loadingDialog: LoadingDialog by loadingDialog()

【问题讨论】:

【参考方案1】:

您可能试图在片段的onDestroy 方法中将其关闭,至少我是这样。将dismiss 方法调用移动到您的活动或片段的onStop

【讨论】:

以上是关于片段未与片段管理器关联。 (对话片段)的主要内容,如果未能解决你的问题,请参考以下文章

如何删除使用片段管理器添加的所有片段?

Android:使用支持片段管理器时复制片段

如何使用Android片段管理器传递变量[重复]

片段管理器空引用异常

是否有充分的理由为 DialogFragments 使用子片段管理器?

执行代码时有时不显示对话框片段