为了账号安全,请及时绑定邮箱和手机立即绑定

NavigationComponent 中的 IllegalStateException

NavigationComponent 中的 IllegalStateException

DIEA 2023-08-16 16:18:18
我在我的应用程序中使用 Jetpack 的导航组件。我有 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)如果我按后退按钮或拨打navController.navigateUp()或 ,我会收到此错误navController.popBackStack()。如果我删除该行getChildFragmentManager().beginTransaction().add(R.id.fragment_container, new SimpleFragment()).commit();从 FirstFragment 我没有错误,所以这意味着子片段管理器有问题,对吧?这里有什么问题吗?
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

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



查看完整回答
反对 回复 2023-08-16
?
哔哔one

TA贡献1854条经验 获得超8个赞

如果我正确理解这一点,而不知道您拥有什么,而不查看“ 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>

在第一个片段的布局中


第一个_fragment_layout.xml


<someView>


  <viewBlasBla/>


  <viewBlasBla/>


  <fragment_container/>  load SimpleFragment here


</someView>

正如您所看到的,您确实正在尝试执行嵌套片段,这不是一个好的实践。如果可能的话尽量避免这种情况:)。


查看完整回答
反对 回复 2023-08-16
  • 2 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信