问题描述
情况:
- 片段A导航到DialogFragment B(单击按钮)
- 在给定条件下,在B的PositiveButton中->导航至DialogFragment C
问题:
单击DialogFragment B的确认按钮时,B会收到此DialogFragment的onDestroy调用。 无论如何,这都是有意的,当B不需要导航到C时也没问题。
但是:当B根据要求导航到C时,会发生以下情况:
- C突然弹出一秒钟,然后消失
- 并且导航控制器的当前位置是不是A。我需要一次按下以再次到达A
我也不希望导航控制器位于A,而是希望它位于C并显示DialogFragment。
实施:
片段实现
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>
尝试解决的问题:
- 将dialogFragments分组为嵌套图->仅结构元素,不影响对话框生命周期
- 更新导航依赖项
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
- 将dialogFragmentC中对话框的上下文更改为requireActivity()
- 尝试查找相关问题
- 有人试图navigate from DialogFragment to Fragment。他希望对话框保留在后台。我希望它关闭,但我希望以下对话框在用户交互之前保持打开状态
- how to properly close a dialogFragment,但我不想
navigateUp
- 有人抱怨dialogFragment closes when navigating to other fragment。提到了一个评论者:希望在移至下一个对话框时关闭对话框。我同意这一点,这正是我想要的
摘要
当我从DialogFragmentB导航到DialogFragmentC时,两个DialogFragments都会收到一个onDestroy调用(如leak-canary所观察到的那样)。
我在这里想念什么吗?你有什么建议吗?
如何在不立即关闭DialogFragmentC的情况下(并且无需用户交互)从DialogFragmentB移至DialogFragmentC?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)