FragmentLifecycleTest.java revision 39a21dcc947992baaa700181c08fbe8bb8f077d6
139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell/* 239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * Copyright (C) 2016 The Android Open Source Project 339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * 439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * you may not use this file except in compliance with the License. 639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * You may obtain a copy of the License at 739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * 839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * http://www.apache.org/licenses/LICENSE-2.0 939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * 1039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * Unless required by applicable law or agreed to in writing, software 1139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * distributed under the License is distributed on an "AS IS" BASIS, 1239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * See the License for the specific language governing permissions and 1439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell * limitations under the License. 1539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell */ 1639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 1739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 1839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellpackage android.support.v4.app; 1939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 2039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport android.support.test.rule.ActivityTestRule; 2139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport android.support.test.runner.AndroidJUnit4; 2239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport android.support.v4.app.test.EmptyFragmentTestActivity; 2339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport android.test.suitebuilder.annotation.MediumTest; 2439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport android.view.View; 2539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport org.junit.Rule; 2639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport org.junit.Test; 2739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport org.junit.runner.RunWith; 2839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 2939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport static junit.framework.Assert.assertNotNull; 3039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellimport static junit.framework.TestCase.*; 3139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 3239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell@RunWith(AndroidJUnit4.class) 3339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powellpublic class FragmentLifecycleTest { 3439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 3539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @Rule 3639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell public ActivityTestRule<EmptyFragmentTestActivity> mActivityRule = 3739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell new ActivityTestRule<EmptyFragmentTestActivity>(EmptyFragmentTestActivity.class); 3839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 3939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @Test 4039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @MediumTest 4139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell public void basicLifecycle() throws Throwable { 4239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager(); 4339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final StrictFragment strictFragment = new StrictFragment(); 4439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 4539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Add fragment; StrictFragment will throw if it detects any violation 4639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // in standard lifecycle method ordering or expected preconditions. 4739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().add(strictFragment, "EmptyHeadless").commit(); 4839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 4939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 5039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment is not added", strictFragment.isAdded()); 5139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment is detached", strictFragment.isDetached()); 5239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment is not resumed", strictFragment.isResumed()); 5339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 5439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Test removal as well; StrictFragment will throw here too. 5539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().remove(strictFragment).commit(); 5639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 5739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 5839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment is added", strictFragment.isAdded()); 5939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment is resumed", strictFragment.isResumed()); 6039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 6139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // This one is perhaps counterintuitive; "detached" means specifically detached 6239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // but still managed by a FragmentManager. The .remove call above 6339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // should not enter this state. 6439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment is detached", strictFragment.isDetached()); 6539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell } 6639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 6739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @Test 6839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @MediumTest 6939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell public void detachment() throws Throwable { 7039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager(); 7139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final StrictFragment f1 = new StrictFragment(); 7239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final StrictFragment f2 = new StrictFragment(); 7339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 7439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().add(f1, "1").add(f2, "2").commit(); 7539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 7639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 7739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1 is not added", f1.isAdded()); 7839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 2 is not added", f2.isAdded()); 7939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 8039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Test detaching fragments using StrictFragment to throw on errors. 8139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().detach(f1).detach(f2).commit(); 8239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 8339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 8439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1 is not detached", f1.isDetached()); 8539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 2 is not detached", f2.isDetached()); 8639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 1 is added", f1.isAdded()); 8739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 2 is added", f2.isAdded()); 8839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 8939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Only reattach f1; leave v2 detached. 9039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().attach(f1).commit(); 9139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 9239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 9339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1 is not added", f1.isAdded()); 9439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 1 is detached", f1.isDetached()); 9539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 2 is not detached", f2.isDetached()); 9639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 9739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Remove both from the FragmentManager. 9839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().remove(f1).remove(f2).commit(); 9939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 10039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 10139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 1 is added", f1.isAdded()); 10239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 2 is added", f2.isAdded()); 10339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 1 is detached", f1.isDetached()); 10439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 2 is detached", f2.isDetached()); 10539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell } 10639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 10739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @Test 10839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @MediumTest 10939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell public void basicBackStack() throws Throwable { 11039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager(); 11139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final StrictFragment f1 = new StrictFragment(); 11239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final StrictFragment f2 = new StrictFragment(); 11339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 11439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Add a fragment normally to set up 11539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().add(f1, "1").commit(); 11639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 11739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 11839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1 is not added", f1.isAdded()); 11939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 12039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Remove the first one and add a second. We're not using replace() here since 12139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // these fragments are headless and as of this test writing, replace() only works 12239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // for fragments with views and a container view id. 12339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Add it to the back stack so we can pop it afterwards. 12439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().remove(f1).add(f2, "2").addToBackStack("stack1").commit(); 12539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 12639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 12739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 1 is added", f1.isAdded()); 12839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 2 is not added", f2.isAdded()); 12939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 13039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Test popping the stack 13139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.popBackStack(); 13239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 13339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 13439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 2 is added", f2.isAdded()); 13539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1 is not added", f1.isAdded()); 13639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell } 13739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 13839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @Test 13939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @MediumTest 14039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell public void attachBackStack() throws Throwable { 14139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager(); 14239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final StrictFragment f1 = new StrictFragment(); 14339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final StrictFragment f2 = new StrictFragment(); 14439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 14539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Add a fragment normally to set up 14639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().add(f1, "1").commit(); 14739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 14839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 14939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1 is not added", f1.isAdded()); 15039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 15139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().detach(f1).add(f2, "2").addToBackStack("stack1").commit(); 15239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 15339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 15439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1 is not detached", f1.isDetached()); 15539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 2 is detached", f2.isDetached()); 15639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 1 is added", f1.isAdded()); 15739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 2 is not added", f2.isAdded()); 15839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell } 15939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 16039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @Test 16139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @MediumTest 16239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell public void viewLifecycle() throws Throwable { 16339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Test basic lifecycle when the fragment creates a view 16439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 16539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager(); 16639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final StrictViewFragment f1 = new StrictViewFragment(); 16739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 16839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().add(android.R.id.content, f1).commit(); 16939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 17039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 17139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1 is not added", f1.isAdded()); 17239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final View view = f1.getView(); 17339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertNotNull("fragment 1 returned null from getView", view); 17439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1's view is not attached to a window", view.isAttachedToWindow()); 17539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 17639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().remove(f1).commit(); 17739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 17839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 17939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 1 is added", f1.isAdded()); 18039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertNull("fragment 1 returned non-null from getView after removal", f1.getView()); 18139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 1's previous view is still attached to a window", 18239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell view.isAttachedToWindow()); 18339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell } 18439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 18539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @Test 18639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @MediumTest 18739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell public void viewReplace() throws Throwable { 18839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell // Replace one view with another, then reverse it with the back stack 18939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 19039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager(); 19139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final StrictViewFragment f1 = new StrictViewFragment(); 19239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell final StrictViewFragment f2 = new StrictViewFragment(); 19339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 19439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().add(android.R.id.content, f1).commit(); 19539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 19639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 19739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1 is not added", f1.isAdded()); 19839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 19939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell View origView1 = f1.getView(); 20039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertNotNull("fragment 1 returned null view", origView1); 20139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1's view not attached", origView1.isAttachedToWindow()); 20239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 20339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.beginTransaction().replace(android.R.id.content, f2).addToBackStack("stack1").commit(); 20439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 20539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 20639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 1 is added", f1.isAdded()); 20739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 2 is added", f2.isAdded()); 20839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertNull("fragment 1 returned non-null view", f1.getView()); 20939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 1's old view still attached", origView1.isAttachedToWindow()); 21039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell View origView2 = f2.getView(); 21139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertNotNull("fragment 2 returned null view", origView2); 21239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 2's view not attached", origView2.isAttachedToWindow()); 21339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 21439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.popBackStack(); 21539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell executePendingTransactions(fm); 21639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 21739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1 is not added", f1.isAdded()); 21839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 2 is added", f2.isAdded()); 21939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertNull("fragment 2 returned non-null view", f2.getView()); 22039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertFalse("fragment 2's view still attached", origView2.isAttachedToWindow()); 22139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell View newView1 = f1.getView(); 22239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertNotSame("fragment 1 had same view from last attachment", origView1, newView1); 22339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell assertTrue("fragment 1's view not attached", newView1.isAttachedToWindow()); 22439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell } 22539a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell 22639a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell private void executePendingTransactions(final FragmentManager fm) throws Throwable { 22739a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell mActivityRule.runOnUiThread(new Runnable() { 22839a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell @Override 22939a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell public void run() { 23039a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell fm.executePendingTransactions(); 23139a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell } 23239a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell }); 23339a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell } 23439a21dcc947992baaa700181c08fbe8bb8f077d6Adam Powell} 235