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
收听打开片段的结果。由于取消了对话框片段
,因此它从未收到结果。这是不可能的。对话框目标实现以下状态:
当您导航到新的目的地时,实现此接口的目的地将自动从后堆栈中弹出
因此,当您导航到
目标时,对话框目标将自动从后堆栈中弹出。在多个对话框目标之间导航时,情况并非如此(这些目标可以堆叠在另一个目标之上)
这里进一步解释了一些限制,即:
目的地,系统后退按钮实际工作的唯一方法是弹出所有浮动窗口(否则它们会在任何其他操作之前拦截后退按钮),因为这些窗口总是在内容上方浮动
这不是导航组件强加的限制-同样的问题也适用于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()
}
}
}