Fragment not associated with a fragment manager. (Dialog Fragment)
Asked Answered
I

1

20

I have a dialog fragment, and i make a class for lazy initialization. When i'm showing the dialog, it's showing like normal. but, when i'm dismissing the dialog, it crash caused by : Fragment not associated with a fragment manager.

i have tried to postDelayed dimiss too, but still crashing.

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

enter image description here

Izaak answered 14/6, 2020 at 7:53 Comment(0)
G
1

You may be trying to dismiss it in the onDestroy method of a fragment, that was my case at least. Move the dismiss method call to the onStop of your activity or a fragment.

Gravely answered 14/9, 2020 at 13:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.