Robolectric can not inflate fragment inside viewpager. It can be inflated if the layout just contains only androidx.recyclerview.widget.RecyclerView as root view 🤔
android.view.InflateException: XML file /Users/luongvo/WORKS/android/_libs/robolectric.shadows-supportv4/app/build/intermediates/merged-not-compiled-resources/debug/layout/fragment_aaa.xml line #-1 (sorry, not yet implemented): FragmentManager is already executing transactions
Caused by: java.lang.IllegalStateException: FragmentManager is already executing transactions
at androidx.fragment.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2207)
at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2239)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:654)
at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:168)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:401)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
at android.view.View.measure(View.java:23169)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at org.robolectric.shadows.ShadowMessageQueue.dispatchMessage(ShadowMessageQueue.java:144)
at org.robolectric.shadows.ShadowMessageQueue.access$200(ShadowMessageQueue.java:35)
at org.robolectric.shadows.ShadowMessageQueue$1.run(ShadowMessageQueue.java:123)
at org.robolectric.util.Scheduler$ScheduledRunnable.run(Scheduler.java:386)
at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:278)
at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:260)
at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:243)
at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:233)
at org.robolectric.util.Scheduler.setIdleState(Scheduler.java:88)
at org.robolectric.util.Scheduler.unPause(Scheduler.java:123)
at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:316)
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:367)
at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:27)
at android.view.ViewGroup.addView(ViewGroup.java)
at android.view.ViewGroup.addView(ViewGroup.java:4837)
at androidx.appcompat.widget.Toolbar.addSystemView(Toolbar.java:1405)
at androidx.appcompat.widget.Toolbar.ensureMenuView(Toolbar.java:1054)
at androidx.appcompat.widget.Toolbar.setMenu(Toolbar.java:551)
at androidx.appcompat.widget.ToolbarWidgetWrapper.setMenu(ToolbarWidgetWrapper.java:370)
at androidx.appcompat.widget.ActionBarOverlayLayout.setMenu(ActionBarOverlayLayout.java:721)
at androidx.appcompat.app.AppCompatDelegateImpl.preparePanel(AppCompatDelegateImpl.java:1583)
at androidx.appcompat.app.AppCompatDelegateImpl.doInvalidatePanelMenu(AppCompatDelegateImpl.java:1869)
at androidx.appcompat.app.AppCompatDelegateImpl$2.run(AppCompatDelegateImpl.java:230)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at org.robolectric.shadows.ShadowMessageQueue.dispatchMessage(ShadowMessageQueue.java:144)
at org.robolectric.shadows.ShadowMessageQueue.access$200(ShadowMessageQueue.java:35)
at org.robolectric.shadows.ShadowMessageQueue$1.run(ShadowMessageQueue.java:123)
at org.robolectric.util.Scheduler$ScheduledRunnable.run(Scheduler.java:386)
at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:278)
at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:260)
at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:243)
at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:233)
at org.robolectric.util.Scheduler.setIdleState(Scheduler.java:88)
at org.robolectric.util.Scheduler.unPause(Scheduler.java:123)
at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:316)
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:367)
at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:27)
at android.view.ViewGroup.addView(ViewGroup.java)
at android.view.ViewGroup.addView(ViewGroup.java:4837)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:867)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at co.nimblehq.robolectric.shadows.supportv4.AAAFragment.onCreateView(AAAFragment.kt:12)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2243)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:654)
at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:168)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:401)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
at android.view.View.measure(View.java:23169)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at org.robolectric.shadows.ShadowMessageQueue.dispatchMessage(ShadowMessageQueue.java:144)
at org.robolectric.shadows.ShadowMessageQueue.access$200(ShadowMessageQueue.java:35)
at org.robolectric.shadows.ShadowMessageQueue$1.run(ShadowMessageQueue.java:123)
at org.robolectric.util.Scheduler$ScheduledRunnable.run(Scheduler.java:386)
at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:278)
at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:260)
at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:243)
at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:233)
at org.robolectric.util.Scheduler.setIdleState(Scheduler.java:88)
at org.robolectric.util.Scheduler.unPause(Scheduler.java:123)
at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:316)
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:367)
at org.robolectric.android.controller.ActivityController.visible(ActivityController.java:119)
at co.nimblehq.robolectric.shadows.supportv4.AAATest.setup(AAATest.kt:25)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.robolectric.internal.SandboxTestRunner$2.evaluate(SandboxTestRunner.java:260)
at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:130)
at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:42)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.robolectric.internal.SandboxTestRunner$1.evaluate(SandboxTestRunner.java:84)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
@RunWith(RobolectricTestRunner::class)
class AAATest {
private lateinit var fragment: AAAFragment
@Before
fun setup() {
val intent = Intent()
val activityController = Robolectric.buildActivity(MainActivity::class.java, intent)
.create()
.start()
.resume()
.visible()
val activity = activityController.get()
activity.viewPagerHotelInfo.currentItem = 0
val adapter = activity.viewPagerHotelInfo.adapter as SmartFragmentStatePagerAdapter
fragment = adapter.getRegisteredFragment(0) as AAAFragment
fragment.shouldNotBeNull()
}
@Test
fun `When click at the gallery, it opens full screen image with correct extras`() {
fragment.shouldNotBeNull()
}
}
Description
Robolectric can not inflate fragment inside viewpager. It can be inflated if the layout just contains only
androidx.recyclerview.widget.RecyclerView
as root view 🤔Steps to Reproduce
AAATest.kt
AAATest.kt
AAAFragment.kt
fragment_aaa.xml
Robolectric & Android Version
Robolectric: 4.1-SNAPSHOT Android: 28