在 Android Dialogfragment show() 方法 TAG 参数中传递啥

Posted

技术标签:

【中文标题】在 Android Dialogfragment show() 方法 TAG 参数中传递啥【英文标题】:What to pass in Android Dialog fragment show() method's TAG parameter在 Android Dialogfragment show() 方法 TAG 参数中传递什么 【发布时间】: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 有什么解决办法吗? 你有什么解决办法吗? 也许在显示对话框之前,您从导航中删除调用片段? 【参考方案1】:

当我尝试从后台恢复应用程序时,我对自定义 DialogFragment 类的 mTag 字段所做的更改触发了同样的崩溃。

从您发布的源代码中可以看出,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()
  

【讨论】:

以上是关于在 Android Dialogfragment show() 方法 TAG 参数中传递啥的主要内容,如果未能解决你的问题,请参考以下文章

主题不适用于 Android 上的 DialogFragment

Android P 中弃用的 DialogFragment 类

Android:DialogFragment.dismissInternal 处 DialogFragment.dismissAllow 处的 NullPointerException

Android:为啥 DialogFragment 在方向更改时返回空指针

Android 官方推荐 : DialogFragment 创建对话框

Android 官方推荐 : DialogFragment 创建对话框