Android Dialog片段show方法的TAG参数中要传递的内容

问题描述

希望你一切都好。

我创建了一个对话框片段,并在实例上调用了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()
  }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...