调用getChildFragmentManager时出现的Bug

异常:

java.lang.IllegalStateException: Activity has been destroyed

at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)

at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)

at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)

at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)

at android.support.v4.view.ViewPager.populate(ViewPager.java:1012)

at android.support.v4.view.ViewPager.populate(ViewPager.java:881)

at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:434)

at com.itcode.reader.fragment.MineFragment.onViewCreated(MineFragment.java:49)

at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:925)

at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)

at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)

at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)

at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)

at android.os.Handler.handleCallback(Handler.java:615)

at android.os.Handler.dispatchMessage(Handler.java:92)

at android.os.Looper.loop(Looper.java:137)

场景:

Fragment中有一个ViewPager,ViewPager的每个pager为Fragment

调用代码:

@Override

public void onViewCreated(View view, Bundle savedInstanceState) {

super.onViewCreated(view, savedInstanceState);

viewPager = (ViewPager) view.findViewById(R.id.pager);

ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager(),TITLE);

viewPager.setAdapter(adapter);

TabPageIndicator mIndicator = (TabPageIndicator) view.findViewById(R.id.indicator);

mIndicator.setViewPager(viewPager);

}

解决方案:

在每个调用getChildFragmentManager()的fragment中加入:

@Override

public void onDetach() {

super.onDetach();

try {

Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");

childFragmentManager.setAccessible(true);

childFragmentManager.set(this, null);

} catch (NoSuchFieldException e) {

throw new RuntimeException(e);

} catch (IllegalAccessException e) {

throw new RuntimeException(e);

}

}

即可!

异常解析:

如果你仔细查看Fragment的实现,你会看到当fragment进行到detached状态时,它会重置它的内部状态。

然而,它没有重置mChildFragmentManager.这是当前版本support库的一个bug.

这导致在Fragment重新attach时,它(fragment)没有重新attachm childFragmentManager,从而引发了上面的异常.

时间: 2024-08-01 04:26:30

调用getChildFragmentManager时出现的Bug的相关文章

调用函数时传递的实参个数arguments.length; ,函数定义时的形参个数sum.length

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>范例6-4</title>

水晶报表 Crystal Report 调用存储过程时出错 找不到表 ,解决方法。

用 CrystalReportViewer1 控件在asp.net的网页上显示报表,如果做报表时调用数据表数据的方式调用是可以成功的,但报表是用存储过程获取数据方式会出现以下错误: 找不到表'RptOpenCheck;1' . 文件 G:\TEMP\FO-OpenCheck {6D191F06-DECF-4A25-88FC-8553E3D435AA}.rpt 内出错: 找不到表. Error: 未将对象引用设置到对象的实例. The table 'RptOpenCheck;1' could no

jQuery 全选与反选时出现的bug!

今天在写项目,使用jQuery1.10.2 发现一个小小的bug, 在设置checked属性时,前两次反选的时候是正常的,后面均不正确,通过调试, 准确的说应该是只有第一次是正确的,在第二次单击时,事件快完成的时候的运行的流程有点奇怪.所以自己感觉这么 成熟的框架不应该出现这个问题,于是又将1.11.1版本下载下来,也是jQuery1的最新版本测试,同样末果,问题依 然存在,使用标准的document.getElementById, 直接设置值是没有问题的. 我本人根据测试,应该是jQuery的

动态调用WebService时动态获取返回Class中的属性

直接给代码: var ret = HTTPS.WSHelper.InvokeWebService("WebService URL", "MethodName", object[] args);var type = ret.GetType();var propertyinfo = type.GetProperty("result");if (propertyinfo == null){       throw new Exception("

CCLabelAtlas的宽度为奇数时的显示bug

遇到一个很郁闷的bug,CCLabelAtlas设置文字内容在ipad上和android上正常,就只有iphone怎么显示都不正常.后来把它宽度 + 1,然后就正常了.发现以前宽度设置为21px.23px都有问题,+1px变为22px就正常了   按上图设置,然后用ps将画布的宽度再+1,让文字选区居中就ok了 CCLabelAtlas的宽度为奇数时的显示bug

C#调用WebService时插入cookie

SOAPUI插入Cookie的方法 SOAP插入cookie的方法如下,点击Head,点击加号,然后直接设置就可以了. C#中调用webService时插入Cookie 由于调用的时候必须要带上cookie,才能成功获取到数据,而正常的通过引用服务,C#会生成一堆代码,但那只是个空壳子,并没有设置cookie的地方.在网上找了很多资料,最后找到了方法,在此总结一下,以便其他人少走弯路. 由于我们是客户端,服务端无法控制,所以网上找到那些设置config,什么启用cookie啊,都是没用的,除非你

PLS-00306: 调用 &#39;SYNCRN&#39; 时参数个数或类型错误

System.Data.OracleClient.OracleException (0x80131938): ORA-00604: 递归 SQL 级别 1 出现错误 ORA-06550: 第 1 行, 第 7 列: PLS-00306: 调用 'SYNCRN' 时参数个数或类型错误 ORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored 在 System.Data.OracleClient.OracleConnection.CheckError 解决

Lua 基础:调用函数时用点号还是用冒号

本文转载于:http://www.benmutou.com/archives/1789 1.初学者最易混乱Top1——调用函数时用点号还是用冒号? 我们来看看下面的两句代码: mSprite.setPosition(100, 20); mSprite:setPosition(100, 20); 对于初次接触Lua的朋友来说,这简直就是噩梦,为嘛函数的调用有两种形式,是让我们随便挑的意思吗? 这两种形式是有区别的,区别很大,但只有一个. 不过,暂时不解释,后面再介绍. 2.最简单的类 我们先来看看

Bug:(使用xib加载控制器view时遇到的bug) loaded some nib but the view outlet was not set

当使用 initWithNibName 函数, 并使用 由nib文件生成的ViewController 的view属性时候,遇到这个问题. UIViewController * UIVC = [[UIViewController alloc] initWithNibName:@"loc" bundle:nil]; [self.view addSubview:UIVC.view]; NibName[2203:207] *** Terminating app due to uncaught