片段返回堆栈清除问题
Fragment back stack clearing Issue
我正在使用 fragments
并且导航流程类似于
Fragment A -> Fragment B -> Fragment C -> Fragment D
表单 fragment
D 我需要通过清除返回堆栈导航到 fragment
A 但问题出在 fragment
C 的 onCreateView()
方法中 我正在显示一个对话框
当我通过清除返回堆栈从 D 导航到 A 时 fragment
会出现与片段 C
中显示的相同的弹出窗口
下面是我用来清除堆栈的代码
FragmentManager fm = getActivity().getSupportFragmentManager();
for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
您的问题在于您处理片段生命周期的方式。您希望 Fragment C 只执行一次 onCreateView
(以显示弹出窗口),但是每次创建视图时都会调用 onCreateView
(例如,每次您在片段上调用 remove(替换非常有效)同样,删除+添加),然后使用 popbackstack 从 backstack 将其添加回来)。
对于您的问题,有两种解决方案:
更清晰的一个:不是从 onCreateView
显示弹出窗口,而是从片段 C 中的 onCreate
调用它。这样你将保证它只在创建片段实例时被调用。
不太干净:不要在 Fragment C 和 D 事务之间使用 replace
,而是调用 add
,这样当您在 Fragment D 中弹出后台堆栈时,Fragment C onCreateView
赢了' 被调用是因为视图从未被破坏(从未调用 remove/replace)。
我正在使用 fragments
并且导航流程类似于
Fragment A -> Fragment B -> Fragment C -> Fragment D
表单 fragment
D 我需要通过清除返回堆栈导航到 fragment
A 但问题出在 fragment
C 的 onCreateView()
方法中 我正在显示一个对话框
当我通过清除返回堆栈从 D 导航到 A 时 fragment
会出现与片段 C
下面是我用来清除堆栈的代码
FragmentManager fm = getActivity().getSupportFragmentManager();
for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
您的问题在于您处理片段生命周期的方式。您希望 Fragment C 只执行一次 onCreateView
(以显示弹出窗口),但是每次创建视图时都会调用 onCreateView
(例如,每次您在片段上调用 remove(替换非常有效)同样,删除+添加),然后使用 popbackstack 从 backstack 将其添加回来)。
对于您的问题,有两种解决方案:
更清晰的一个:不是从 onCreateView
显示弹出窗口,而是从片段 C 中的 onCreate
调用它。这样你将保证它只在创建片段实例时被调用。
不太干净:不要在 Fragment C 和 D 事务之间使用 replace
,而是调用 add
,这样当您在 Fragment D 中弹出后台堆栈时,Fragment C onCreateView
赢了' 被调用是因为视图从未被破坏(从未调用 remove/replace)。