diff options
2 files changed, 35 insertions, 0 deletions
diff --git a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt index 25b37009d71..0acdadaca76 100644 --- a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt +++ b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt @@ -23,6 +23,8 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentFactory import androidx.fragment.app.FragmentManager +import androidx.navigation.NavController +import androidx.navigation.Navigation import androidx.test.annotation.UiThreadTest import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest @@ -83,6 +85,28 @@ class DialogFragmentNavigatorTest { @UiThreadTest @Test + fun testFindNavController() { + val dialogFragment = EmptyDialogFragment() + // Fake using a NavHostFragment and instead just manually show the DialogFragment + dialogFragment.showNow(fragmentManager, null) + assertWithMessage("Dialog should be shown") + .that(dialogFragment.requireDialog().isShowing) + .isTrue() + + // And set a NavController on the root view + val navController = NavController(emptyActivity) + Navigation.setViewNavController( + dialogFragment.requireDialog().window!!.decorView, + navController + ) + + val returnedNavController = NavHostFragment.findNavController(dialogFragment) + assertThat(returnedNavController) + .isEqualTo(navController) + } + + @UiThreadTest + @Test fun testPop() { lateinit var dialogFragment: DialogFragment fragmentManager.fragmentFactory = object : FragmentFactory() { diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java index 97be486c9c6..c8d466d683e 100644 --- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java +++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java @@ -16,6 +16,7 @@ package androidx.navigation.fragment; +import android.app.Dialog; import android.content.Context; import android.content.res.TypedArray; import android.os.Bundle; @@ -28,6 +29,7 @@ import androidx.annotation.CallSuper; import androidx.annotation.NavigationRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentContainerView; import androidx.navigation.NavController; @@ -117,6 +119,15 @@ public class NavHostFragment extends Fragment implements NavHost { if (view != null) { return Navigation.findNavController(view); } + + // For DialogFragments, look at the dialog's decor view + Dialog dialog = fragment instanceof DialogFragment + ? ((DialogFragment) fragment).getDialog() + : null; + if (dialog != null && dialog.getWindow() != null) { + return Navigation.findNavController(dialog.getWindow().getDecorView()); + } + throw new IllegalStateException("Fragment " + fragment + " does not have a NavController set"); } |