6

希望你一切顺利。

我创建了一个对话框片段并在实例上调用了 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() 方法的期望是什么?应该传递什么标签来优雅地恢复片段?

注意安全!

4

1 回答 1

0

当我尝试从后台恢复应用程序时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")

或与 lib 一起显示:navigate(R.id.you_dialog_fragment_defined_in_nav_graph_xml)

甚至可以dismiss将其作为避免恢复过程的解决方法:

  override fun onPause() {
    super.onPause()
    dismiss()
  }
于 2021-01-21T21:18:47.740 回答