NavigationComponent中的IllegalStateException

时间:2019-09-21 21:57:12

标签: java android android-fragments android-jetpack android-navigation

我在我的应用程序中使用了Jetpack的Navigation Component。我有2个片段,例如我和FirstFragment和SecondFragment在导航图中从第一到第二都有导航。一切都以这种方式正常工作。我想将子片段添加到FirstFragment。因此,在FirstFragment类的onCreateView方法中,我添加了这一行

getChildFragmentManager().beginTransaction().add(R.id.fragment_container, new SimpleFragment()).commit();

这样,我在FirstFragment中有一个内部片段。从FirstFragment导航到SecondFragment仍然可以正常工作,但是当我在SecondFragment中按下“后退”按钮时,出现此错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.abc.def, PID: 28856
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        at android.view.ViewGroup.addViewInner(ViewGroup.java:4937)
        at android.view.ViewGroup.addView(ViewGroup.java:4768)
        at android.view.ViewGroup.addView(ViewGroup.java:4708)
        at android.view.ViewGroup.addView(ViewGroup.java:4681)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1353)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1642)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1736)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1800)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3096)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3050)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2688)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1369)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2633)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2377)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2333)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2230)
        at androidx.fragment.app.FragmentManager$3.run(FragmentManager.java:414)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

如果我按下后退按钮或致电navController.navigateUp()navController.popBackStack(),则会收到此错误。如果我删除了行

getChildFragmentManager().beginTransaction().add(R.id.fragment_container, new SimpleFragment()).commit();

from FirstFragment我没有错误,所以这意味着子片段管理器有问题,对吗?怎么了?

2 个答案:

答案 0 :(得分:0)

如果我正确理解了这一点却不知道自己拥有什么,而没有查看布局“ fragment_container”,则告诉我它的ViewGroup类型目前只能生一个孩子。不能提供更多信息。

这意味着fragment_container已经有一个孩子,在添加SimpleFragment之前需要删除它。

假设您是第一个像这样的片段布局

<someView>

  <fragment_container/>  // hear you are loading your first fragment and trying load the SimpleFragment as well which is causing problem.

</someView>

您需要的是

<someView>

  <fragment_container/>  only load First Fragment "first_fragment_layout.xml"

</someView>

第一个片段的布局

first_fragment_layout.xml

<someView>

  <viewBlasBla/>

  <viewBlasBla/>

  <fragment_container/>  load SimpleFragment here

</someView>

如您所见,您确实在尝试嵌套片段,这不是一个好习惯。尽量避免这种情况:)。

you can reach me here

答案 1 :(得分:0)

问题出在SimpleFragment中。我一直在引用该片段(具有View mRootView字段)的根视图,并且在不为空的情况下也没有重新创建它。