Android FragmentManager.findFragmentByTag()返回null
我发现了一种特殊情况,即Android FragmentManager.findFragmentByTag()返回null,android,android-fragments,android-dialogfragment,Android,Android Fragments,Android Dialogfragment,我发现了一种特殊情况,即FragmentManager.findfracentbytag(“tag”)返回null 我有一种直觉,这和时间有关 我有一个具有以下回调的网络库: onStart() { Utils.ShowLoadingDialog("loading"); } onFinnish() { Utils.DismissLoadingDialog("loading"); } 然后在我的Utils类中,我有以下代码: public void showLoadingDia
FragmentManager.findfracentbytag(“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();
}
}
现在,这通常可以正常工作。但是,在网络层检测到没有internet的情况下。它将抛出一个错误,然后立即调用
onfinish()
。在这种情况下,Utils.DismissDialog(tag)
无法找到片段,因此不会将其删除?使用TRY-CATCH或偶而IF语句检查当前的internet连接。使用TRY-CATCH或偶而IF语句检查当前的internet连接。提交事务时可能会出现这种情况。
只需在show方法中检查是否已提交用于对话框片段的事务
transaction.commit();
在此之前,您的片段管理器没有要添加到其中的片段
此外,您还需要确保您正在从您向其提交片段的同一活动的片段管理器中查找片段。提交事务时可能就是这种情况。 只需在show方法中检查是否已提交用于对话框片段的事务
transaction.commit();
在此之前,您的片段管理器没有要添加到其中的片段
您还需要确保您正在从您提交片段的同一活动的片段管理器中查找片段。您可以使用来等待片段事务通过
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();
}
}
您可以使用等待片段事务通过
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();
}
}
您是在调用
showLoadingDialog(…)
之前还是之后立即进行网络调用?如果是这样,您的直觉可能是正确的,即您的网络库在执行showLoadingDialog
的最后一行之前在其线程上抛出一个错误(假设它在另一个线程上)。我认为您有一个问题,在显示错误的对话框之前,您应该先测试一下是否存在internet。您是在调用showLoadingDialog(…)
之前还是之后立即进行网络调用?如果是这样,您的直觉可能是正确的,即您的网络库在执行showLoadingDialog
的最后一行之前在其线程上抛出一个错误(假设它在另一个线程上)。我认为您有一个错误,您应该在显示错误的对话框之前测试是否存在internet。这解决了问题。我不确定这样做是否正确。但是我读了一些书,发现.commit()
是一个异步操作。这意味着片段管理器将在有时间的时候加载事务。这解决了问题。我不确定这样做是否正确。但是我读了一些书,发现.commit()
是一个异步操作。这意味着片段管理器将在有时间加载事务时加载该事务。