情况:
问题:
当单击 DialogFragment B 的确认按钮时,B 会收到对此 DialogFragment 的 onDestroy 调用。
无论如何,这是有意的,当 B 不需要导航到 C 时没有问题。
但是 : 当 B 按要求导航到 C 时,会发生以下情况:
我也不希望导航 Controller 位于 A。我希望它位于显示 DialogFragment 的 C。
执行:
fragment 实现
class FragmentA : Fragment() {
...
// is assigned as onClick listener to the button
fun onClickButton() {
if (findNavController().currentDestination?.id == R.id.FragmentANavId) {
val action = FragmentADirections.actionFragmentAToDialogFragmentB()
findNavController().navigate(action)
}
}
// in separate file
class DialogFragmentB : DialogFragment() {
...
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = MaterialAlertDialogBuilder(requireContext())
...
.setPositiveButton("Save", { _, _ ->
if (...) {
val action = DialogFragmentBDirections.actionDialogFragmentBToDialogFragmentC
findNavController().navigate(action)
}
return builder.create()
}
}
class DialogFragmentC : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = MaterialAlertDialogBuilder(requireContext()) // also tried with requireActivity() as context
...
.setPositiveButton("Confirm", { _, _ ->
// code to handle the user confirmation
}
return builder.create()
}
}
nav_graph.xml <fragment
android:label="@string/some_text"
android:name="...FragmentA"
android:id="@+id/fragmentA" >
<action
android:id="@+id/action_fragmentA_to_fragmentDialogB"
app:destination="@id/fragmentDialogB" />
</fragment>
// I put them into a nested graph
<navigation android:id="@+id/dialogFragmentsNested"
app:startDestination="@id/fragmentDialogB">
<dialog
android:id="@+id/fragmentDialogB"
android:name="...FragmentDialogB">
<action
android:id="@+id/action_fragmentDialogB_to_fragmentDialogC"
app:destination="@id/fragmentDialogC" />
</dialog>
<dialog
android:id="@+id/fragmentDialogC"
android:name="fragmentDialogC">
</dialog>
</navigation>
解决方案的尝试:implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0' // from 2.2.2
implementation 'androidx.navigation:navigation-ui-ktx:2.3.0' // from 2.2.2
navigateUp
概括
当我从 DialogFragmentB 导航到 DialogFragmentC 时,两个 DialogFragment 都会收到一个 onDestroy 调用(如泄漏金丝雀所观察到的)。
我在这里错过了什么吗?你有什么建议吗?
如何在不立即关闭 DialogFragmentC(且无需用户交互)的情况下从 DialogFragmentB 移动到 DialogFragmentC?
最佳答案
对我有用的是调用findNavController().navigateUp()
在导航到 DialogFragmentC 之前
在 DialogFragmentB 我写道:
class DialogFragmentB : DialogFragment() {
...
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = MaterialAlertDialogBuilder(requireContext())
...
.setPositiveButton("Save", { _, _ ->
if (...) {
findNavController().navigateUp()
val action = DialogFragmentBDirections.actionDialogFragmentBToDialogFragmentC
findNavController().navigate(action)
}
return builder.create()
}
}
关于android - 如何使用导航组件导航嵌套的 DialogFragments 而不破坏第二个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63385031/