问题描述
希望你一切都好。
我创建了一个对话框片段,并在实例上调用了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:”。因此,自从我提供了自定义标签以来,找不到Fragment是有道理的。
客户端调用show()方法的期望形式是什么? 应该传递什么标签来优雅地还原片段?
保持安全!
解决方法
当我尝试从后台恢复应用程序时,我对自定义 mTag
类的 DialogFragment
字段所做的更改触发了同样的崩溃。
从您发布的源代码中可以看出,tag
字段在恢复状态时由 DialogFragmentNavigator
设置和使用。这只是意味着您不能使用自定义标签。
public final class DialogFragmentNavigator extends Navigator<DialogFragmentNavigator.Destination> {
...
private static final String DIALOG_TAG = "androidx-nav-fragment:navigator:dialog:";
所以你应该对前缀进行硬编码:show(... "androidx-nav-fragment:navigator:dialog:0")
或与库一起显示:navigate(R.id.you_dialog_fragment_defined_in_nav_graph_xml)
甚至可以dismiss
将其作为避免恢复过程的解决方法:
override fun onPause() {
super.onPause()
dismiss()
}