[go: nahoru, domu]

Ensure findFragment works with <fragment> tag

When calling FragmentManager.findFragment() with the view of a fragment
that was added using the <fragment> tag, that fragment was being ignored
(either the parentFragment was found or it was crashing saying the view
did not have a fragment set).

This change sets the proper view tag on <fragment> tag inflated
fragments.

Test: Added test
Bug: 147784323
Change-Id: I4346b694ba2af1fab1f68a879df96beaf129cd0c
(cherry picked from commit 3905584b8c5d63aeb50a4de9a44b48ca029435a8)
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewTest.kt
index 86d419a..7a709e8c 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewTest.kt
@@ -336,6 +336,17 @@
     }
 
     @Test
+    fun findInflatedFragment() {
+        activityRule.setContentView(R.layout.activity_inflated_fragment)
+        val fm = activityRule.activity.supportFragmentManager
+
+        val fragment = fm.findFragmentById(R.id.inflated_fragment)!!
+
+        assertThat(FragmentManager.findFragment<StrictViewFragment>(fragment.requireView()))
+            .isSameInstanceAs(fragment)
+    }
+
+    @Test
     fun findFragmentFindByIdChildView() {
         activityRule.setContentView(R.layout.simple_container)
         val fm = activityRule.activity.supportFragmentManager
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
index c04619a..56e2cab 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
@@ -210,6 +210,7 @@
                     mFragment.mSavedFragmentState), null, mFragment.mSavedFragmentState);
             if (mFragment.mView != null) {
                 mFragment.mView.setSaveFromParentEnabled(false);
+                mFragment.mView.setTag(R.id.fragment_container_view_tag, mFragment);
                 if (mFragment.mHidden) mFragment.mView.setVisibility(View.GONE);
                 mFragment.onViewCreated(mFragment.mView, mFragment.mSavedFragmentState);
                 mDispatcher.dispatchOnFragmentViewCreated(