cew*_*phi 5 android nested android-dialogfragment android-architecture-navigation
情况:
问题:
当单击 DialogFragment B 的确认按钮时,B 会收到此 DialogFragment 的 onDestroy 调用。无论如何,这是有意的,当 B 不需要导航到 C 时没有问题。
但是:当 B 按请求导航到 C 时,会发生以下情况:
我也不希望导航控制器位于 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()
     }
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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()
     }
}
Run Code Online (Sandbox Code Playgroud)