android 非法参数异常:在viewpager2内使用getChildFragmentManager()时未找到ID为的视图

vhmi4jdf  于 2023-03-16  发布在  Android
关注(0)|答案(2)|浏览(132)

我的应用程序结构是这样的-
(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(),但得到相同的错误。

eimct9ow

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()

tvz2xvvm

tvz2xvvm2#

我不知道这是一个问题,但你可以试试。而不是:获取子片段管理器()
用途:获取支持片段管理器()
或者,您可以创建下面的方法,并在需要时通过传递要加载的片段来调用它。

private void callFragment(Fragment fragment){
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    
    transaction.replace(R.id.frameLayout_id, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

您可以从here了解更多信息。

相关问题