在 getChildFragmentManager() 之后调用 getSupportFragmentManager() 导致 IllegalStateException:递归进入 executePendingTransactions
Calling getSupportFragmentManager() after getChildFragmentManager() causes IllegalStateException: Recursive entry to executePendingTransactions
我正在使用 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>
打开我正在使用的片段
ft.add(R.id.fragment_content, frag);
ft.commit();
fm.beginTransaction();
一个片段包含地图,所以我在布局文件中使用这些行
<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" />
这是我的Java代码
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();
}
现在,如果 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.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 在你使用它之前?
超级(fragment.getChildFragmentManager());
您好,您似乎遇到了递归问题Recursive entry to executePendingTransactions
,因为您不止一次重复调用,并且在异常处理中,根据实践捕获异常错误并尝试 "do something()"
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();
}
删除不必要的调用catch
区域,如果出现新错误,请务必阅读日志猫,并执行adding/removing正确的 @override
中的片段,例如 activity 的 @onCreate
使用 fragment
.
希望对您有所帮助。
Layout fragments 一次很棒,添加并忘记那种用法。除此之外,您必须使用 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()
可用,但应格外小心使用。它会立即使所有计划的交易 运行,并且当它们 运行ning 时,您不能再次调用它。
我发现了错误。我正在使用 FragmentActivity 管理器来 return 地图对象以删除导致问题的地图片段,而日志不是。所以,我改变了
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();
我正在使用 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>
打开我正在使用的片段
ft.add(R.id.fragment_content, frag);
ft.commit();
fm.beginTransaction();
一个片段包含地图,所以我在布局文件中使用这些行
<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" />
这是我的Java代码
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();
}
现在,如果 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.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 在你使用它之前?
超级(fragment.getChildFragmentManager());
您好,您似乎遇到了递归问题Recursive entry to executePendingTransactions
,因为您不止一次重复调用,并且在异常处理中,根据实践捕获异常错误并尝试 "do something()"
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();
}
删除不必要的调用catch
区域,如果出现新错误,请务必阅读日志猫,并执行adding/removing正确的 @override
中的片段,例如 activity 的 @onCreate
使用 fragment
.
希望对您有所帮助。
Layout fragments 一次很棒,添加并忘记那种用法。除此之外,您必须使用 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()
可用,但应格外小心使用。它会立即使所有计划的交易 运行,并且当它们 运行ning 时,您不能再次调用它。
我发现了错误。我正在使用 FragmentActivity 管理器来 return 地图对象以删除导致问题的地图片段,而日志不是。所以,我改变了
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();