首页 > 解决方案 > 如何防止 BottomSheetDialogFragment 在导航到另一个片段后关闭?

问题描述

NavigationComponent在我的应用程序上使用。

我有一个特定的流程,点击BottomSheetDialogFragment应用程序的按钮后应该导航到另一个片段。但是当那个 Fragment 被弹出时,我需要导航回上一个BottomSheetDialogFragment

由于某种原因,BottomSheetDialogFragment它被自动解雇。

Frag A : click on a button  
Frag A -> Dialog B : click on a button  
Frag A -> Dialog B -> Frag C : pop Frag C from the stack  
Frag A : Dialog B was automatically dismissed =;/  

如何防止这种解雇?


问:为什么我需要BottomSheetDialogFragment不被解雇?
A:我通过LiveData. 由于被解雇,BottomSheetDialogFragment它永远不会收到结果。

标签: androidandroid-dialogfragmentandroid-dialogandroid-navigationandroid-bottomsheetdialog

解决方案


这是不可能的。对话框目标实现了FloatingWindow 接口,该接口声明:

当您导航到新目的地时,实现此接口的目的地将自动从后台弹出。

因此,当您导航到目的地时,预计对话目的地会自动从后台堆栈中弹出<fragment>在多个对话目的地之间导航时不是这种情况(它们可以堆叠在一起)。

这个问题更多地解释了这里的限制,即:

  1. 对话框是始终位于活动窗口上方的单独窗口。这意味着无论底层的 FragmentManager 处于什么状态或者你做了什么 FragmentTransactions,对话框都会继续拦截系统返回按钮。

  2. 片段容器(即您的正常目的地)上的操作不会影响对话片段。如果您在嵌套的 FragmentManager 上执行 FragmentTransactions 也是如此。

因此,一旦您导航到<fragment>目的地,系统后退按钮实际工作的唯一方法是弹出所有浮动窗口(否则它们会先拦截后退按钮),因为这些窗口始终浮动在内容之上。

这不是导航组件强加的限制——同样的问题适用于BottomSheetDialogFragment有关 Fragment 返回堆栈和系统返回按钮的任何用法。


推荐阅读