Android - 每种类型的 DialogFragment 显示不超过 1 个

Android - Don't show more than 1 of each type of DialogFragment

我们的应用程序中使用了很多不同类型的 DialogFragment,因此我创建了一个 BaseFragment 来提取一些通用代码。但是有一个限制:我们不应该在任何给定时间显示超过 1 个相同类型片段的实例(但是,我们 应该 同时显示 FragmentAFragmentB 如果它们同时发生)。

我目前在下面的代码确实实现了这种行为,但我不满意,因为它会在子 类 中产生大量样板。有没有更简洁的方法来完成这个?

基础片段

abstract class BaseFragment : DialogFragment() {

    override fun show(manager: FragmentManager, tag: String?) {
        if (!isShowing()) {
            setShowing(true)
            super.show(manager, tag)
        }
    }

    override fun onDismiss(dialog: DialogInterface) {
        super.onDismiss(dialog)
        setShowing(false)
    }

    abstract fun isShowing(): Boolean

    abstract fun setShowing(isShowing: Boolean)

    override fun onCreateDialog(savedInstanceState: Bundle?) {
        // ...
    }

}

子片段

class ChildFragment : BaseFragment() {

    companion object {
        private var sIsShowing = false
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): AlertDialog {
        // ...
        return super.onCreateDialog(savedInstanceState)
    }

    // ...

    override fun isShowing(): Boolean = sIsShowing

    override fun setShowing(isShowing: Boolean) { sIsShowing = isShowing }

}

您可以这样做:

abstract class BaseFragment : DialogFragment() {

    override fun show(manager: FragmentManager, tag: String?) {
        if (manager.findFragmentByTag(tag) == null) {
            super.show(manager, tag)
            manager.executePendingTransactions()
        }
    }
}

请注意在同一对话框 类 之间保持 tag 相同。例如,扩展 BaseFragmentDialog1 的所有实例都应具有相同的 tag,这与 [= 的另一个子 类 中使用的 tag 不同13=].