我的应用程序结构是这样的-
(Main活动)-〉(片段1)-〉(视图寻呼机-〉片段A,片段B)。
当我在Fragment A or B
内部执行片段事务时,我得到了错误,注意这里我使用getChildFragmentManager()
进行片段事务。
NotificationDetails notificationFragment = NotificationDetails.newInstance(list);
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.setReorderingAllowed(true);
transaction.addToBackStack(null);
transaction.replace(R.id.Navigation_Main_Layout, notificationFragment, null);
transaction.commit();
java.lang.非法参数异常:没有为片段通知详细信息(560448 c9 - 144 a-49 f8-a4 d3 - 47 f491 b6 a563 ID= 0x 7 f0 a005 b)找到ID为0x 7 f0 a005 b(com.example.id/Navigation_Main_Layout)的视图
当我这样调用片段事务时,注意这里我使用getSupportFragmentManager()
作为片段transaction.it可以完美地工作,没有任何问题。
NotificationDetails notificationFragment = NotificationDetails.newInstance(list);
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.setReorderingAllowed(true);
transaction.addToBackStack(null);
transaction.replace(R.id.Navigation_Main_Layout, notificationFragment, null);
transaction.commit();
这是我的活动布局。你可以看到id存在于布局中。
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/Navigation_parent"
>
<!--The Main Layout For Content-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--Toolbar for actionbar -->
<include
android:id="@+id/Navigation_Drawer_toolbar"
layout="@layout/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/Navigation_Main_Layout"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout>
有人能告诉我为什么它可以使用getActivity().getSupportFragmentManager()
而不能使用getChildFragmentManager()
吗?什么时候我应该在viewpager的片段(子片段)中使用getChildFragmentManager()?
我也尝试了getParentFragmentManager()
,但得到相同的错误。
2条答案
按热度按时间eimct9ow1#
如Fragment Manager手册中所述,您应该使用哪个FragmentManager完全取决于布局的位置:
重要的是,子片段必须放置在其父片段的布局中--它们必须相互嵌套,就像片段本身相互嵌套一样。
文档中的另一张图片对此进行了解释,该图片解释了每个Fragment与FragmentManager之间的关系:
在您的示例中,您尝试了
getChildFragmentManager()
,但您的R.id.Navigation_Main_Layout
不是Fragment布局的一部分,因此会崩溃。然后尝试使用
getParentFragmentManager()
,但R.id.Navigation_Main_Layout
也不在父片段的布局中(因为这是包含ViewPager的片段1)。您的
R.id.Navigation_Main_Layout
位于Activity的布局中,这意味着您可以用来将片段放入Activity布局(但不能放入任何片段内)的唯一有效FragmentManager是Activity的getSupportFragmentManager()
。tvz2xvvm2#
我不知道这是一个问题,但你可以试试。而不是:获取子片段管理器()
用途:获取支持片段管理器()
或者,您可以创建下面的方法,并在需要时通过传递要加载的片段来调用它。
您可以从here了解更多信息。