android - fragment 回栈清除问题

标签 android android-fragments android-alertdialog fragment-backstack

我正在使用 fragment 和导航流程

 Fragment A -> Fragment B -> Fragment C -> Fragment D 

Form fragment D 我需要通过清除返回堆栈导航到 fragment A,但问题出在 onCreateView() 方法中 fragment C 我正在显示一个对话框

当我通过清除 fragment 上的返回堆栈从 D 导航到 A 时,会出现与 fragment C 中显示的相同弹出窗口

下面是我用来清除堆栈的代码

FragmentManager fm = getActivity().getSupportFragmentManager();

for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
     fm.popBackStack();
   }

最佳答案

您遇到的问题在于处理 fragment 生命周期的方式。您希望 fragment C 仅执行一次 onCreateView (以显示弹出窗口),但每次创建 View 时都会调用 onCreateView (例如,每次您在 fragment (替换的工作方式几乎相同,删除+添加),然后使用 popbackstack 将其从 backstack 添加回来)。

对于您的问题,有两种解决方案:

更简洁的一个:不是从 onCreateView 显示弹出窗口,而是从 Fragment C 中的 onCreate 调用它。这样,您将保证仅在 fragment 实例时调用它已创建。

不太干净:不要在 fragment C 和 D 事务之间使用 replace,而是调用 add,这样当您在 fragment D、 fragment C 中弹出回栈时 onCreateView 不会被调用,因为 View 从未被销毁(从未调用过删除/替换)。

关于android - fragment 回栈清除问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47199241/

相关文章:

android - 从内容提供者检索数据并将其显示在其他 Activity 上

android - 使用kivy向服务器发送数据

java - PopBackStack 前一个最后一个 fragment 并检查它是哪个 fragment

安卓:DialogFragment.dismissInternal 处的 NullPointerException 处 DialogFragment.dismissAllow

android - 我看不到的循环

android - Android 的 Postscript 驱动程序?

android - Realm 对象服务器 + MSSQL/MySQL

Android - Fragment 之间的通信

android - 防止在 AlertDialog 中自动聚焦 EditText

android - 如何将焦点设置到 AlertDialog 中的特定输入字段?