diff options
author | Ian Lake <ilake@google.com> | 2018-11-29 16:29:32 -0800 |
---|---|---|
committer | Ian Lake <ilake@google.com> | 2018-11-30 20:27:11 +0000 |
commit | 6ed4698615b86f06b2aca0cab4c827e85437254a (patch) | |
tree | c3cb9d0faead87a0a9b98cbd2098b5a2df971601 /fragment | |
parent | f18c3b0446f3623ae4f56b7dbe0c47857495996e (diff) | |
download | support-6ed4698615b86f06b2aca0cab4c827e85437254a.tar.gz |
Add requireView() to Fragment
In cases where you know that the Fragment
has a View, provide a requireView()
method that returns a @NonNull View
rather than requiring Kotlin users use
fragment.view!!
Test: new FragmentTest
BUG: 120241368
Change-Id: I6ff3759ed6b6f4975d2d858e7592ad5bfc01042f
Diffstat (limited to 'fragment')
14 files changed, 105 insertions, 55 deletions
diff --git a/fragment/api/1.1.0-alpha03.txt b/fragment/api/1.1.0-alpha03.txt index 0e4cde92755..dd5f2a0e6e2 100644 --- a/fragment/api/1.1.0-alpha03.txt +++ b/fragment/api/1.1.0-alpha03.txt @@ -115,6 +115,7 @@ package androidx.fragment.app { method public final android.content.Context requireContext(); method public final androidx.fragment.app.FragmentManager requireFragmentManager(); method public final Object requireHost(); + method public final android.view.View requireView(); method public void setAllowEnterTransitionOverlap(boolean); method public void setAllowReturnTransitionOverlap(boolean); method public void setArguments(android.os.Bundle?); diff --git a/fragment/api/current.txt b/fragment/api/current.txt index 0e4cde92755..dd5f2a0e6e2 100644 --- a/fragment/api/current.txt +++ b/fragment/api/current.txt @@ -115,6 +115,7 @@ package androidx.fragment.app { method public final android.content.Context requireContext(); method public final androidx.fragment.app.FragmentManager requireFragmentManager(); method public final Object requireHost(); + method public final android.view.View requireView(); method public void setAllowEnterTransitionOverlap(boolean); method public void setAllowReturnTransitionOverlap(boolean); method public void setArguments(android.os.Bundle?); diff --git a/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.java b/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.java index 1f664033485..0f1f4cda6c8 100644 --- a/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.java +++ b/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.java @@ -450,7 +450,7 @@ public class FragmentAnimationTest { .commit(); FragmentTestUtil.waitForExecution(mActivityRule); - final View fragmentView = fragment1.getView(); + final View fragmentView = fragment1.requireView(); final TranslateAnimation xAnimation = new TranslateAnimation(0, 1000, 0, 0); mActivityRule.runOnUiThread(new Runnable() { @@ -569,8 +569,8 @@ public class FragmentAnimationTest { private void assertPostponed(AnimatorFragment fragment, int expectedAnimators) throws InterruptedException { assertTrue(fragment.mOnCreateViewCalled); - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); - assertEquals(0f, fragment.getView().getAlpha(), 0f); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); + assertEquals(0f, fragment.requireView().getAlpha(), 0f); assertEquals(expectedAnimators, fragment.numAnimators); } diff --git a/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimatorTest.java b/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimatorTest.java index ec1a2a7e678..4c08a34f077 100644 --- a/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimatorTest.java +++ b/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimatorTest.java @@ -126,7 +126,7 @@ public class FragmentAnimatorTest { mActivityRule.runOnUiThread(new Runnable() { @Override public void run() { - assertEquals(View.GONE, fragment.getView().getVisibility()); + assertEquals(View.GONE, fragment.requireView().getVisibility()); } }); @@ -141,7 +141,7 @@ public class FragmentAnimatorTest { mActivityRule.runOnUiThread(new Runnable() { @Override public void run() { - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); } }); @@ -150,7 +150,7 @@ public class FragmentAnimatorTest { mActivityRule.runOnUiThread(new Runnable() { @Override public void run() { - assertEquals(View.GONE, fragment.getView().getVisibility()); + assertEquals(View.GONE, fragment.requireView().getVisibility()); } }); } @@ -173,7 +173,7 @@ public class FragmentAnimatorTest { mActivityRule.runOnUiThread(new Runnable() { @Override public void run() { - assertEquals(View.GONE, fragment.getView().getVisibility()); + assertEquals(View.GONE, fragment.requireView().getVisibility()); } }); @@ -189,7 +189,7 @@ public class FragmentAnimatorTest { mActivityRule.runOnUiThread(new Runnable() { @Override public void run() { - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); } }); @@ -198,7 +198,7 @@ public class FragmentAnimatorTest { mActivityRule.runOnUiThread(new Runnable() { @Override public void run() { - assertEquals(View.GONE, fragment.getView().getVisibility()); + assertEquals(View.GONE, fragment.requireView().getVisibility()); } }); } @@ -547,8 +547,8 @@ public class FragmentAnimatorTest { private void assertPostponed(AnimatorFragment fragment, int expectedAnimators) throws InterruptedException { assertTrue(fragment.mOnCreateViewCalled); - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); - assertEquals(0f, fragment.getView().getAlpha(), 0f); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); + assertEquals(0f, fragment.requireView().getAlpha(), 0f); assertEquals(expectedAnimators, fragment.numAnimators); } diff --git a/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.java b/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.java index b2890d57484..6516ae6da17 100644 --- a/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.java +++ b/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.java @@ -676,7 +676,7 @@ public class FragmentReorderingTest { .setReorderingAllowed(true) .commit(); mFM.executePendingTransactions(); - final View editText = fragment2.getView().findViewById(R.id.editText); + final View editText = fragment2.requireView().findViewById(R.id.editText); assertTrue(editText.isFocused()); assertFalse(firstEditText.isFocused()); } diff --git a/fragment/src/androidTest/java/androidx/fragment/app/FragmentTest.java b/fragment/src/androidTest/java/androidx/fragment/app/FragmentTest.java index 7864152929b..a5076794f06 100644 --- a/fragment/src/androidTest/java/androidx/fragment/app/FragmentTest.java +++ b/fragment/src/androidTest/java/androidx/fragment/app/FragmentTest.java @@ -15,6 +15,8 @@ */ package androidx.fragment.app; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; @@ -69,6 +71,31 @@ public class FragmentTest { @SmallTest @UiThreadTest @Test + public void testRequireView() { + StrictViewFragment fragment1 = new StrictViewFragment(); + mActivity.getSupportFragmentManager() + .beginTransaction() + .add(R.id.content, fragment1) + .commitNow(); + assertThat(fragment1.requireView()) + .isNotNull(); + } + + @SmallTest + @UiThreadTest + @Test(expected = IllegalStateException.class) + public void testRequireViewWithoutView() { + StrictFragment fragment1 = new StrictFragment(); + mActivity.getSupportFragmentManager() + .beginTransaction() + .add(fragment1, "fragment") + .commitNow(); + fragment1.requireView(); + } + + @SmallTest + @UiThreadTest + @Test public void testOnCreateOrder() throws Throwable { OrderFragment fragment1 = new OrderFragment(); OrderFragment fragment2 = new OrderFragment(); @@ -135,7 +162,7 @@ public class FragmentTest { if (fragment.getView() == null) { FragmentTestUtil.waitForExecution(mActivityRule); } - final View view = fragment.getView(); + final View view = fragment.requireView(); final Animation animation = view.getAnimation(); if (animation == null || animation.hasEnded()) { // animation has already completed @@ -207,6 +234,11 @@ public class FragmentTest { } catch (IllegalStateException expected) { } try { + fragment.requireView(); + fail(); + } catch (IllegalStateException expected) { + } + try { fragment.requireFragmentManager(); fail(); } catch (IllegalStateException expected) { diff --git a/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.java b/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.java index b6c8562e15e..aab49d648c6 100644 --- a/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.java +++ b/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.java @@ -552,7 +552,7 @@ public class FragmentTransitionTest { final View endGreen = findViewById(fragment2, R.id.greenSquare); final View endBlue = findViewById(fragment2, R.id.blueSquare); - assertEquals(View.GONE, fragment1.getView().getVisibility()); + assertEquals(View.GONE, fragment1.requireView().getVisibility()); assertEquals(View.VISIBLE, startGreen.getVisibility()); assertEquals(View.VISIBLE, startBlue.getVisibility()); @@ -571,7 +571,7 @@ public class FragmentTransitionTest { verifyAndClearTransition(fragment1.reenterTransition, null, startGreen, startBlue); verifyNoOtherTransitions(fragment1); - assertEquals(View.VISIBLE, fragment1.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment1.requireView().getVisibility()); assertEquals(View.VISIBLE, startGreen.getVisibility()); assertEquals(View.VISIBLE, startBlue.getVisibility()); @@ -856,7 +856,7 @@ public class FragmentTransitionTest { } private View findViewById(Fragment fragment, int id) { - return fragment.getView().findViewById(id); + return fragment.requireView().findViewById(id); } private View findGreen() { diff --git a/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewTests.java b/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewTests.java index 4547a4d798e..d958e3933b7 100644 --- a/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewTests.java +++ b/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewTests.java @@ -258,7 +258,7 @@ public class FragmentViewTests { final Fragment replacement1 = fm.findFragmentByTag("1"); FragmentTestUtil.assertChildren(container, replacement1); assertTrue(replacement1.isHidden()); - assertEquals(View.GONE, replacement1.getView().getVisibility()); + assertEquals(View.GONE, replacement1.requireView().getVisibility()); } // Removing a detached fragment should do nothing to the View and popping should bring @@ -334,21 +334,21 @@ public class FragmentViewTests { FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment); - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); fm.beginTransaction().hide(fragment).addToBackStack(null).commit(); FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment); assertTrue(fragment.isHidden()); - assertEquals(View.GONE, fragment.getView().getVisibility()); + assertEquals(View.GONE, fragment.requireView().getVisibility()); fm.popBackStack(); FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment); assertFalse(fragment.isHidden()); - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); } // Hiding a hidden fragment should not throw @@ -391,21 +391,21 @@ public class FragmentViewTests { FragmentTestUtil.assertChildren(container, fragment); assertTrue(fragment.isHidden()); - assertEquals(View.GONE, fragment.getView().getVisibility()); + assertEquals(View.GONE, fragment.requireView().getVisibility()); fm.beginTransaction().show(fragment).addToBackStack(null).commit(); FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment); assertFalse(fragment.isHidden()); - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); fm.popBackStack(); FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment); assertTrue(fragment.isHidden()); - assertEquals(View.GONE, fragment.getView().getVisibility()); + assertEquals(View.GONE, fragment.requireView().getVisibility()); } // Showing a shown fragment should not throw @@ -447,7 +447,7 @@ public class FragmentViewTests { FragmentTestUtil.assertChildren(container, fragment); assertFalse(fragment.isDetached()); - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); fm.beginTransaction().detach(fragment).addToBackStack(null).commit(); FragmentTestUtil.executePendingTransactions(mActivityRule); @@ -460,7 +460,7 @@ public class FragmentViewTests { FragmentTestUtil.assertChildren(container, fragment); assertFalse(fragment.isDetached()); - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); } // Detaching a hidden fragment should remove the View from the hierarchy. Then popping it should @@ -478,7 +478,7 @@ public class FragmentViewTests { FragmentTestUtil.assertChildren(container, fragment); assertFalse(fragment.isDetached()); assertTrue(fragment.isHidden()); - assertEquals(View.GONE, fragment.getView().getVisibility()); + assertEquals(View.GONE, fragment.requireView().getVisibility()); fm.beginTransaction().detach(fragment).addToBackStack(null).commit(); FragmentTestUtil.executePendingTransactions(mActivityRule); @@ -493,7 +493,7 @@ public class FragmentViewTests { FragmentTestUtil.assertChildren(container, fragment); assertTrue(fragment.isHidden()); assertFalse(fragment.isDetached()); - assertEquals(View.GONE, fragment.getView().getVisibility()); + assertEquals(View.GONE, fragment.requireView().getVisibility()); } // Detaching a detached fragment should not throw @@ -542,7 +542,7 @@ public class FragmentViewTests { FragmentTestUtil.assertChildren(container, fragment); assertFalse(fragment.isDetached()); - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); fm.popBackStack(); FragmentTestUtil.executePendingTransactions(mActivityRule); @@ -577,7 +577,7 @@ public class FragmentViewTests { FragmentTestUtil.assertChildren(container, fragment); assertTrue(fragment.isHidden()); assertFalse(fragment.isDetached()); - assertEquals(View.GONE, fragment.getView().getVisibility()); + assertEquals(View.GONE, fragment.requireView().getVisibility()); fm.popBackStack(); FragmentTestUtil.executePendingTransactions(mActivityRule); @@ -633,7 +633,7 @@ public class FragmentViewTests { FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment2); - assertEquals(View.VISIBLE, fragment2.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment2.requireView().getVisibility()); fm.popBackStack(); FragmentTestUtil.executePendingTransactions(mActivityRule); @@ -644,7 +644,7 @@ public class FragmentViewTests { assertFalse(replacement1.isHidden()); assertTrue(replacement1.isAdded()); assertFalse(replacement1.isDetached()); - assertEquals(View.VISIBLE, replacement1.getView().getVisibility()); + assertEquals(View.VISIBLE, replacement1.requireView().getVisibility()); } // Replace of multiple fragments in a container. Popping should replace it back again @@ -673,7 +673,7 @@ public class FragmentViewTests { FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment3); - assertEquals(View.VISIBLE, fragment3.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment3.requireView().getVisibility()); fm.popBackStack(); FragmentTestUtil.executePendingTransactions(mActivityRule); @@ -686,13 +686,13 @@ public class FragmentViewTests { assertFalse(replacement1.isHidden()); assertTrue(replacement1.isAdded()); assertFalse(replacement1.isDetached()); - assertEquals(View.VISIBLE, replacement1.getView().getVisibility()); + assertEquals(View.VISIBLE, replacement1.requireView().getVisibility()); // fragment2 was hidden, so it should be returned hidden assertTrue(replacement2.isHidden()); assertTrue(replacement2.isAdded()); assertFalse(replacement2.isDetached()); - assertEquals(View.GONE, replacement2.getView().getVisibility()); + assertEquals(View.GONE, replacement2.requireView().getVisibility()); } // Replace of empty container. Should act as add and popping should just remove the fragment @@ -711,7 +711,7 @@ public class FragmentViewTests { FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment); - assertEquals(View.VISIBLE, fragment.getView().getVisibility()); + assertEquals(View.VISIBLE, fragment.requireView().getVisibility()); fm.popBackStack(); FragmentTestUtil.executePendingTransactions(mActivityRule); @@ -845,7 +845,7 @@ public class FragmentViewTests { FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment1); - assertEquals(View.INVISIBLE, fragment1.getView().getVisibility()); + assertEquals(View.INVISIBLE, fragment1.requireView().getVisibility()); final InvisibleFragment fragment2 = new InvisibleFragment(); fragment2.visibility = View.GONE; @@ -856,7 +856,7 @@ public class FragmentViewTests { FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment2); - assertEquals(View.GONE, fragment2.getView().getVisibility()); + assertEquals(View.GONE, fragment2.requireView().getVisibility()); } // Test to ensure that popping and adding a fragment properly track the fragments added @@ -951,8 +951,7 @@ public class FragmentViewTests { FragmentTestUtil.executePendingTransactions(mActivityRule); FragmentTestUtil.assertChildren(container, fragment1); - ViewGroup innerContainer = (ViewGroup) - fragment1.getView().findViewById(R.id.fragmentContainer1); + ViewGroup innerContainer = fragment1.requireView().findViewById(R.id.fragmentContainer1); Fragment fragment2 = fragment1.getChildFragmentManager().findFragmentByTag("inner"); FragmentTestUtil.assertChildren(innerContainer, fragment2); diff --git a/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.java b/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.java index 86e68e62fdf..1a52b437533 100644 --- a/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.java +++ b/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.java @@ -367,8 +367,8 @@ public class PostponedTransitionTest { clearTargets(fragment1); clearTargets(fragment2); - final View startBlue1 = fragment1.getView().findViewById(R.id.blueSquare); - final View startBlue2 = fragment2.getView().findViewById(R.id.blueSquare); + final View startBlue1 = fragment1.requireView().findViewById(R.id.blueSquare); + final View startBlue2 = fragment2.requireView().findViewById(R.id.blueSquare); final TransitionFragment fragment3 = new PostponedFragment2(); @@ -465,8 +465,8 @@ public class PostponedTransitionTest { clearTargets(fragment1); clearTargets(fragment2); - final View startBlue1 = fragment1.getView().findViewById(R.id.blueSquare); - final View startBlue2 = fragment2.getView().findViewById(R.id.blueSquare); + final View startBlue1 = fragment1.requireView().findViewById(R.id.blueSquare); + final View startBlue2 = fragment2.requireView().findViewById(R.id.blueSquare); final TransitionFragment fragment3 = new PostponedFragment2(); @@ -563,8 +563,8 @@ public class PostponedTransitionTest { clearTargets(fragment1); clearTargets(fragment2); - final View startBlue1 = fragment1.getView().findViewById(R.id.blueSquare); - final View startBlue2 = fragment2.getView().findViewById(R.id.blueSquare); + final View startBlue1 = fragment1.requireView().findViewById(R.id.blueSquare); + final View startBlue2 = fragment2.requireView().findViewById(R.id.blueSquare); final TransitionFragment fragment3 = new PostponedFragment2(); final StrictFragment strictFragment1 = new StrictFragment(); @@ -621,7 +621,7 @@ public class PostponedTransitionTest { @Test public void commitNowStartsPostponed() throws Throwable { final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager(); - final View startBlue1 = mBeginningFragment.getView().findViewById(R.id.blueSquare); + final View startBlue1 = mBeginningFragment.requireView().findViewById(R.id.blueSquare); final TransitionFragment fragment2 = new PostponedFragment2(); final TransitionFragment fragment1 = new PostponedFragment1(); @@ -634,7 +634,7 @@ public class PostponedTransitionTest { .commit(); FragmentTestUtil.waitForExecution(mActivityRule); - final View startBlue2 = fragment2.getView().findViewById(R.id.blueSquare); + final View startBlue2 = fragment2.requireView().findViewById(R.id.blueSquare); mInstrumentation.runOnMainSync(new Runnable() { @Override @@ -709,7 +709,7 @@ public class PostponedTransitionTest { @Test public void popPostponedTransaction() throws Throwable { final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager(); - final View startBlue = mBeginningFragment.getView().findViewById(R.id.blueSquare); + final View startBlue = mBeginningFragment.requireView().findViewById(R.id.blueSquare); final TransitionFragment fragment = new PostponedFragment2(); @@ -892,7 +892,7 @@ public class PostponedTransitionTest { assertEquals(0, start.sharedElementReturn.targets.size()); assertEquals(0, end.sharedElementReturn.targets.size()); - final View blue = end.getView().findViewById(R.id.blueSquare); + final View blue = end.requireView().findViewById(R.id.blueSquare); assertTrue(end.sharedElementEnter.targets.contains(blue)); assertEquals("blueSquare", end.sharedElementEnter.targets.get(0).getTransitionName()); assertEquals("blueSquare", end.sharedElementEnter.targets.get(1).getTransitionName()); @@ -926,7 +926,7 @@ public class PostponedTransitionTest { assertEquals(2, start.sharedElementReturn.targets.size()); assertEquals(0, end.sharedElementReturn.targets.size()); - final View blue = end.getView().findViewById(R.id.blueSquare); + final View blue = end.requireView().findViewById(R.id.blueSquare); assertTrue(start.sharedElementReturn.targets.contains(blue)); assertEquals("blueSquare", start.sharedElementReturn.targets.get(0).getTransitionName()); assertEquals("blueSquare", start.sharedElementReturn.targets.get(1).getTransitionName()); diff --git a/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/src/main/java/androidx/fragment/app/Fragment.java index 7e3c0f843dc..a9f08dfd3c9 100644 --- a/fragment/src/main/java/androidx/fragment/app/Fragment.java +++ b/fragment/src/main/java/androidx/fragment/app/Fragment.java @@ -1597,6 +1597,22 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener } /** + * Get the root view for the fragment's layout (the one returned by {@link #onCreateView}). + * + * @throws IllegalStateException if no view was returned by {@link #onCreateView}. + * @see #getView() + */ + @NonNull + public final View requireView() { + View view = getView(); + if (view == null) { + throw new IllegalStateException("Fragment " + this + " did not return a View from" + + " onCreateView() or this was called before onCreateView()."); + } + return view; + } + + /** * Called when the fragment's activity has been created and this * fragment's view hierarchy instantiated. It can be used to do final * initialization once these pieces are in place, such as retrieving diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentManagerImpl.java b/fragment/src/main/java/androidx/fragment/app/FragmentManagerImpl.java index b70f69776c6..acee49928ea 100644 --- a/fragment/src/main/java/androidx/fragment/app/FragmentManagerImpl.java +++ b/fragment/src/main/java/androidx/fragment/app/FragmentManagerImpl.java @@ -1890,7 +1890,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate for (int i = 0; i < numAdded; i++) { final Fragment fragment = fragments.valueAt(i); if (!fragment.mAdded) { - final View view = fragment.getView(); + final View view = fragment.requireView(); fragment.mPostponedAlpha = view.getAlpha(); view.setAlpha(0f); } diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java b/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java index b8273a0471f..642058df2b6 100644 --- a/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java +++ b/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java @@ -561,7 +561,7 @@ class FragmentTransition { final Fragment inFragment = fragments.lastIn; final Fragment outFragment = fragments.firstOut; if (inFragment != null) { - inFragment.getView().setVisibility(View.VISIBLE); + inFragment.requireView().setVisibility(View.VISIBLE); } if (inFragment == null || outFragment == null) { return null; // no shared element without a fragment @@ -786,7 +786,7 @@ class FragmentTransition { } final Fragment outFragment = fragments.firstOut; final ArrayMap<String, View> outSharedElements = new ArrayMap<>(); - impl.findNamedViews(outSharedElements, outFragment.getView()); + impl.findNamedViews(outSharedElements, outFragment.requireView()); final SharedElementCallback sharedElementCallback; final ArrayList<String> names; diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java b/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java index 33ba74ef363..7aeeab7066e 100644 --- a/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java +++ b/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java @@ -23,6 +23,7 @@ import android.graphics.Rect; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.annotation.RestrictTo; import androidx.core.view.OneShotPreDrawListener; import androidx.core.view.ViewCompat; @@ -211,7 +212,7 @@ public abstract class FragmentTransitionImpl { * Finds all views that have transition names in the hierarchy under the given view and * stores them in {@code namedViews} map with the name as the key. */ - void findNamedViews(Map<String, View> namedViews, View view) { + void findNamedViews(Map<String, View> namedViews, @NonNull View view) { if (view.getVisibility() == View.VISIBLE) { String transitionName = ViewCompat.getTransitionName(view); if (transitionName != null) { diff --git a/fragment/src/main/java/androidx/fragment/app/ListFragment.java b/fragment/src/main/java/androidx/fragment/app/ListFragment.java index e1e087bd44b..adbcb677603 100644 --- a/fragment/src/main/java/androidx/fragment/app/ListFragment.java +++ b/fragment/src/main/java/androidx/fragment/app/ListFragment.java @@ -189,7 +189,7 @@ public class ListFragment extends Fragment { if (!mListShown && !hadAdapter) { // The list was hidden, and previously didn't have an // adapter. It is now time to show it. - setListShown(true, getView().getWindowToken() != null); + setListShown(true, requireView().getWindowToken() != null); } } } |