DialogFragment findFragmentByTag 为 null 问题

392 阅读1分钟

问题描述

FragmentA页面显示全局 LoadingDialog 弹框 show(childFragmentManager, DialogFragmentA.TAG) ,在 FragmentB页面需要判断 LoadingDialog 是否已显示,但childFragmentManager.findFragmentByTag(DialogFragmentA.TAG) 返回 null

解决方案

通过 getChildFragmentManager()获取对管理 fragment 子级的 FragmentManager 的引用。想要通过 findFragmentByTag() 获取 LoadingDialog ,则需要使用 其宿主 FragmentManager,可以使用 getParentFragmentManager()showfindFragmentByTag, 如果是全局的 DialogFragment 建议使用 根 Activity 的 getSupportFragmentManager()


/**
 * 全局 Loading 工具类
 * Created by RoyYao on 2024/9/3
 */
object LoadingUtil {
    private var loadingDialog: LoadingDialog? = null

    fun show(
        tip: String = "",
    ) {
        // 获取 TopActivityFragmentManager,本 Demo 为单 FragmentActivity App
        val fragmentManager = CommonUtil.getActivityFragmentManager()
        loadingDialog =
            FragmentUtils.findFragment(fragmentManager, LoadingDialog.TAG) as LoadingDialog?
        if (fragmentManager.isStateSaved || loadingDialog?.dialog?.isShowing == true) {
            return
        }
        if (loadingDialog == null) {
            loadingDialog = LoadingDialog()
        }
        loadingDialog?.let {
            fragmentManager.beginTransaction().remove(it).commit()
        }
        loadingDialog?.setTip(tip)
        loadingDialog?.show(fragmentManager, LoadingDialog.TAG)
    }

    fun dismiss() {
        if (CommonUtil.getActivityFragmentManager().isStateSaved) {
            return
        }
        loadingDialog?.dismiss()
    }

参考资料:

Fragment 管理器