Android 在getChildFragmentManager()之后调用getSupportFragmentManager()会导致IllegalStateException:执行EndingTransactions的递归项

Android 在getChildFragmentManager()之后调用getSupportFragmentManager()会导致IllegalStateException:执行EndingTransactions的递归项,android,android-fragments,google-maps-android-api-2,android-nested-fragment,Android,Android Fragments,Google Maps Android Api 2,Android Nested Fragment,我正在使用FrameLayout显示片段 <FrameLayout android:id="@+id/fragment_content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@+id/bottom_layout" android:background="@and

我正在使用FrameLayout显示片段

 <FrameLayout
        android:id="@+id/fragment_content"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/bottom_layout"
        android:background="@android:color/white" >
    </FrameLayout>
一个片段包含地图,所以我在布局文件中使用这些行

<fragment
        android:id="@+id/trafic_Alarm_main_mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.Utilities.MySupportMapFragment"
        android:layout_alignParentTop="true" />
现在,如果调用getChildFragmentManager(),而我切换到另一个使用getSupportFragmentManager开始事务的片段,则会导致崩溃。验证日志

01-16 18:36:15.690    7294-7294/com.TrafikAlarm E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.TrafikAlarm, PID: 7294
    java.lang.IllegalStateException: Recursive entry to executePendingTransactions
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1461)
            at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
我正在使用android studio编译这些库

compile 'com.google.android.gms:play-services:6.5.87'
compile 'com.android.support:appcompat-v7:21.0.3'
当我使用eclipse时,我不需要使用getChildFragmentManager,一切都很好

提前谢谢


  • 由于您的上下文是一个片段,您在使用它之前是否尝试过在子片段管理器上调用super


    super(fragment.getChildFragmentManager())

    您好,执行EndingTransactions的递归条目似乎出现了递归问题,因为您多次重新调用调用,并且在异常处理中,捕获执行错误并尝试“do something()”是错误的

    删除
    捕获
    区域上的不必要的调用,如果出现新错误,请确保读取日志目录,并在使用
    片段
    的活动的正确
    @覆盖
    中添加/删除片段,例如
    @onCreate


    希望能有所帮助。

    版面片段一次性非常好,添加并忘记使用方法。除此之外,您还必须使用java代码管理片段

    添加、替换片段时只需遵守一些规则:

    Int frameId = // id of host view
    Fragment manager = // fragment manager, of Activity or a Fragment
    String tag = // unique tag for the fragment
    String clazz = // class name of the fragment
    Bundle args = // initial data to be supplied to fragment instance
    
    Fragment frg = manager.findFragmentbyTag(tag);
    
    if(frg == null){
      frg = Fragment.instantiate(context,clazz,args);
    }
    
    if(!frg.isAdded()){
       manager.beginTransaction().add(frameId, frg, tag).commit();
    }
    
    如果片段在开始时还必须显示嵌套片段,则可以在其
    onViewCreated()
    中使用上述代码


    FragmentManager本质上是异步的,在
    commit()
    之后,它不会立即应用片段更改。提交计划在将来某个时候进行<代码>executePendingTransactions()可用,但使用时应格外小心。它使所有计划的事务立即运行,当它们运行时,您不能再次调用它。

    我发现了错误。我正在使用FragmentActivity manager返回映射对象,以删除导致问题的映射片段,而日志并没有被删除。所以,我改变了

    TabsActivity.fm.beginTransaction().remove((MySupportMapFragment) TabsActivity.fm.findFragmentById(R.id.trafic_Alarm_main_mapView)).commit();
    


    Java代码的上下文是什么?它在哪里。在父片段中,我假设?可能是您试图使用嵌套在其他片段中的片段。请参考此链接,上下文是片段活动类。为什么要调用
    fm.beginTransaction()第二次?Matish,它只收到一个调用我尝试使用这个,我得到相同的错误mMap=((MySupportMapFragment)getParentFragment().getFragmentManager().findFragmentById(R.id.trafic_Alarm_main_mapView)).getMap();java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.support.v4.app.FragmentManager android.support.v4.app.Fragment.getFragmentManager()”,我应该在哪里调用它?该方法所在的第一行:
    尝试{mMap=(MySupportMapFragment)TabsActivity.fm.findFragmentById(R.id.trafic_Alarm_main_mapView)).getMap()}catch(异常e){mMap=((MySupportMapFragment)getChildFragmentManager().findFragmentById(R.id.trafic_Alarm_main_mapView)).getMap()}
    我没有在任何重写的方法中使用它。父重写的方法是onCreateView,它不支持super(fragment.getChildFragmentManager());
    try{
    
    mMap=(MySupportMapFragment)TabsActivity.fm.findFragmentById(R.id.trafic_Alarm_main_mapView)).getMap();
    
    }catch (Exception e){
    
    mMap=((MySupportMapFragment)getChildFragmentManager().findFragmentById(R.id.trafic_Alarm_main_mapView)).getMap();
    
    }
    
    Int frameId = // id of host view
    Fragment manager = // fragment manager, of Activity or a Fragment
    String tag = // unique tag for the fragment
    String clazz = // class name of the fragment
    Bundle args = // initial data to be supplied to fragment instance
    
    Fragment frg = manager.findFragmentbyTag(tag);
    
    if(frg == null){
      frg = Fragment.instantiate(context,clazz,args);
    }
    
    if(!frg.isAdded()){
       manager.beginTransaction().add(frameId, frg, tag).commit();
    }
    
    TabsActivity.fm.beginTransaction().remove((MySupportMapFragment) TabsActivity.fm.findFragmentById(R.id.trafic_Alarm_main_mapView)).commit();
    
    TabsActivity.fm.beginTransaction().remove((MySupportMapFragment) getChildFragmentManager().findFragmentById(R.id.trafic_Alarm_main_mapView)).commit();