单例 fragment getChildFragmentManager java.lang.IllegalStateException: No activity

错误提示如下:

11-27 14:47:34.983: D/CrashHandler(8105): handleException-->java.lang.IllegalStateException: No activity
11-27 14:47:34.983: D/CrashHandler(8105): 程序即将退出
11-27 14:47:34.983: D/CrashHandler(8105): main
11-27 14:47:34.990: W/System.err(8105): java.lang.IllegalStateException: No activity
11-27 14:47:35.014: D/dalvikvm(8105): GC_CONCURRENT freed 1916K, 63% free 5387K/14407K, external 6306K/7682K, paused 4ms+6ms
11-27 14:47:35.108: W/System.err(8105): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1091)
11-27 14:47:35.108: W/System.err(8105): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
11-27 14:47:35.108: W/System.err(8105): 	at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1884)
11-27 14:47:35.108: W/System.err(8105): 	at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1514)
11-27 14:47:35.108: W/System.err(8105): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
11-27 14:47:35.108: W/System.err(8105): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
11-27 14:47:35.108: W/System.err(8105): 	at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
11-27 14:47:35.108: W/System.err(8105): 	at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
11-27 14:47:35.108: W/System.err(8105): 	at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
11-27 14:47:35.108: W/System.err(8105): 	at android.os.Handler.handleCallback(Handler.java:587)
11-27 14:47:35.108: W/System.err(8105): 	at android.os.Handler.dispatchMessage(Handler.java:92)
11-27 14:47:35.108: W/System.err(8105): 	at android.os.Looper.loop(Looper.java:130)
11-27 14:47:35.108: W/System.err(8105): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
11-27 14:47:35.108: W/System.err(8105): 	at java.lang.reflect.Method.invokeNative(Native Method)
11-27 14:47:35.108: W/System.err(8105): 	at java.lang.reflect.Method.invoke(Method.java:507)
11-27 14:47:35.108: W/System.err(8105): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:881)
11-27 14:47:35.108: W/System.err(8105): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:639)
11-27 14:47:35.108: W/System.err(8105): 	at dalvik.system.NativeStart.main(Native Method)
11-27 14:47:35.123: D/CrashHandler(8105): BOARD:CP5832
11-27 14:47:35.123: D/CrashHandler(8105): BOOTLOADER:unknown
11-27 14:47:35.123: D/CrashHandler(8105): BRAND:Coolpad

fragment 单例中调用getChildFragmentManager(),activity destory后再进入该activity fragment中,一直报java.lang.IllegalStateException: No activity
后发现http://code.google.com/p/android/issues/detail?id=42601
如下:

Sign in to add a comment
 	
Reported by andrewys...@gmail.com, Jan 10, 2013
When a Fragment that uses its child FragmentManager (calls getChildFragmentManager()) is detached, performDestroy() calls dispatchDestroy() on the child FragmentManager, with the understanding that the child FragmentManager will no longer be used. However, the parent Fragment retains a reference to the destroyed child FragmentManager, which causes an illegal move to ACTIVITY_CREATED in the child FragmentManager if the parent Fragment is re-attached. Perhaps the child FragmentManager should be set to null after dispatchDestroy() is called, to force it to be regenerated when the parent Fragment is re-attached. An alternate best practice appears to be to not keep references to detached Fragments that have used their child FragmentManagers.

This behavior has been observed in both the support v4 library and in the standard API (android.app.Fragment). The stack trace shown below belongs to API level 17 for the attached sample code.

java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.self/edu.self.A}: java.lang.IllegalStateException: No activity


解决方法
fragment 中

@Override
	public void onDestroy() {
		super.onDestroy();
		// 将fragment中的变量mChildFragmentManager清空
		try {
			Field f = Fragment.class.getDeclaredField("mChildFragmentManager");
			f.setAccessible(true);
			f.set(this, null);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值