问题描述
FragmentA页面显示全局 LoadingDialog 弹框 show(childFragmentManager, DialogFragmentA.TAG) ,在 FragmentB页面需要判断 LoadingDialog 是否已显示,但childFragmentManager.findFragmentByTag(DialogFragmentA.TAG) 返回 null
解决方案
通过 getChildFragmentManager()获取对管理 fragment 子级的 FragmentManager 的引用。想要通过 findFragmentByTag() 获取 LoadingDialog ,则需要使用 其宿主 FragmentManager,可以使用 getParentFragmentManager() 来 show 跟 findFragmentByTag, 如果是全局的 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()
}