Android 如何防止导航到另一个片段后,该片段被忽略?

Android 如何防止导航到另一个片段后,该片段被忽略?,android,android-dialogfragment,android-dialog,android-navigation,android-bottomsheetdialog,Android,Android Dialogfragment,Android Dialog,Android Navigation,Android Bottomsheetdialog,我正在我的应用程序上使用NavigationComponent 我有一个特定的流程,在点击BottomSheetDialogFragment按钮后,应用程序应该导航到另一个片段。但是当弹出该片段时,我需要导航回上一个BottomSheetDialogFragment 由于某种原因,BottomSheetDialogFragment将自动被解除 Frag A : click on a button Frag A -> Dialog B : click on a button Frag

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

我有一个特定的流程,在点击
BottomSheetDialogFragment
按钮后,应用程序应该导航到另一个片段。但是当弹出该片段时,我需要导航回上一个
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
不被驳回?

答:我通过
LiveData
收听打开片段的结果。由于取消了
对话框片段
,因此它从未收到结果。

这是不可能的。对话框目标实现以下状态:

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

因此,当您导航到
目标时,对话框目标将自动从后堆栈中弹出。在多个对话框目标之间导航时,情况并非如此(这些目标可以堆叠在另一个目标之上)

这里进一步解释了一些限制,即:

  • 对话框是始终位于活动窗口上方的单独窗口。这意味着无论基础FragmentManager处于何种状态或您执行何种FragmentTransactions,该对话框都将继续拦截system back按钮

  • 片段容器上的操作(即,您的正常目的地)不会影响对话框片段。如果在嵌套的FragmentManager上执行FragmentTransactions,则相同

  • 因此,一旦您导航到您的
    目的地,系统后退按钮实际工作的唯一方法是弹出所有浮动窗口(否则它们会在任何其他操作之前拦截后退按钮),因为这些窗口总是在内容上方浮动

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

    您不希望不关闭对话框,因为它会停留在下一个目标的顶部

    如果您的意思是
    findNavController().currentbackentry.savedstateholder.getLiveData(MY_KEY)

    然后,您应该能够将结果设置为
    previousbackbackbackentry
    ,因为它将在对话框之前为您提供目标

    Frag A : click on a button 
    Frag A -> Dialog B : click on a button (automatically popped-off)
    Frag A -> Dialog B -> Frag C : pop Frag C from the stack
      
    
    然后


    非常感谢您的解释\o/。我将尝试解决这种情况^^
    class FragA : Fragment() {
        
        ...
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            
            ...
    
            findNavController().currentBackStackEntry.savedStateHandle?.getLiveData<MyResult>(MY_KEY).observe(viewLifecycleOwner) {
               // get your result here
               // show Dialog B again if you like ?
            }
        }
    }
    
    class FragC : Fragment() {
    
        ...
    
        private fun setResultAndFinish(result: MyResult) {
            findNavController().apply { 
                previousBackStackEntry?.savedStateHandle?.set(MY_KEY, result)
                popBackStack()
            }
        }
        
    }