【发布时间】:2020-12-20 20:04:39
【问题描述】:
希望你一切顺利。
我创建了一个对话框片段并在实例上调用了 show()。我将自定义标签传递给 show() 的参数。该片段不需要其他参数。 在更改配置、调整应用窗口大小时,应用会崩溃。
Caused by: android.view.InflateException: Binary XML file line #35 in com.signal.android.stage:layout/activity_main2: Binary XML file line #35 in com.signal.android.stage:layout/activity_main2: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #35 in com.signal.android.stage:layout/activity_main2: Error inflating class fragment
Caused by: java.lang.IllegalStateException: DialogFragment 0 doesn't exist in the FragmentManager
at androidx.navigation.fragment.DialogFragmentNavigator.onRestoreState(DialogFragmentNavigator.java:148)
这是来自 DialogFragmentNavigator.java 的方法:
@Override
public void onRestoreState(@Nullable Bundle savedState) {
if (savedState != null) {
mDialogCount = savedState.getInt(KEY_DIALOG_COUNT, 0);
for (int index = 0; index < mDialogCount; index++) {
DialogFragment fragment = (DialogFragment) mFragmentManager
.findFragmentByTag(DIALOG_TAG + index);
if (fragment != null) {
fragment.getLifecycle().addObserver(mObserver);
} else {
throw new IllegalStateException("DialogFragment " + index
+ " doesn't exist in the FragmentManager");
}
}
}
}
请查看已使用的 DIALOG_TAG 已硬编码为“androidx-nav-fragment:navigator:dialog:”。因此,由于我提供了自定义 TAG,因此没有找到 Fragment 是有道理的。
客户端调用 show() 方法的期望是什么? 应该传递什么标签来优雅地恢复片段?
注意安全!
【问题讨论】:
-
我们应该总是在这里使用 fragment.getTag() 代替吗?
-
这个 Aleon 有什么解决办法吗?
-
你有什么解决办法吗?
-
也许在显示对话框之前,您从导航中删除调用片段?
标签: android android-fragments android-dialogfragment onrestoreinstancestate