FragmentManager.findFragmentByTag()返回null

时间:2018-04-04 09:57:17

标签: android android-fragments android-dialogfragment

我在FragmentManager.findFragmentByTag("tag")返回null时找到了具体案例。

我有直觉感觉它与时间有关吗?

我有一个带有以下回调的网络库:

onStart()
{
    Utils.ShowLoadingDialog("loading");
}

onFinnish()
{
    Utils.DismissLoadingDialog("loading");
}

然后在我的Utils类中,我有以下代码:

public void showLoadingDialog(String title, String message, String tag) {
        DialogFragment loadingDialogFragment = new LoadingDialogFragment();
        Bundle args = new Bundle();
        args.putString(CommonBundleAttributes.CONNECTING_ACTIVITY_DIALOG_TITLE, title);
        args.putString(CommonBundleAttributes.CONNECTING_ACTIVITY_DIALOG_MESSAGE, message);
        loadingDialogFragment.setArguments(args);
        FragmentTransaction transaction  = fragManager.beginTransaction();
        loadingDialogFragment.show(transaction, tag);
    }

public void dismissLoadingDialog(String tag) {
        DialogFragment dg = (DialogFragment) fragManager.findFragmentByTag(tag);
        if (dg != null) {
            // this reference isn't null so the dialog is available
            dg.dismissAllowingStateLoss();
        }
    }

现在这通常很好。但是,在网络层检测到没有互联网的情况下。它会抛出一个错误然后立即调用onFinnish()。在这种情况下,Utils.DismissDialog(tag)无法找到片段,因此不会将其解散?

3 个答案:

答案 0 :(得分:3)

您可以使用executePendingTransactions()等待片段事务通过。

public void dismissLoadingDialog(String tag) {
        fragManager.executePendingTransactions();
        DialogFragment dg = (DialogFragment) fragManager.findFragmentByTag(tag);
        if (dg != null) {
            // this reference isn't null so the dialog is available
            dg.dismissAllowingStateLoss();
        }
    }

答案 1 :(得分:0)

使用TRY-CATCH甚至IF语句检查当前的互联网连接。

答案 2 :(得分:0)

这可以是提交事务的情况。 如果您已经为Dialog片段提交了事务,请检查show方法中是否存在。

transaction.commit();

直到您的片段管理器没有要添加的片段。

此外,您需要确保从相应的Activity片段管理器中找到您提交片段的片段。