androdi Fragment删除和隐藏空碎片引发的血案(at
2017-03-29 本文已影响0人
锄禾少年不太帅
今天在做导航功能的时候用到了多个碎片,然后对碎片进行切换管理,我的代码是这样:

最代码的倒数第五行:
baseActivity.getSupportFragmentManager().beginTransaction().hide(mCurFragment).show(fragment).commit();
意思是隐藏上一个碎片显示传入进来的碎片,这样写是没错的,但是我在mainActivity中一创建的时候就调用这个方法把第一个碎片显示出来 mainPresenter.selectFragment(0);这个时候就发送了一个错误,如图:

提示是一个空指针,但是并没有提示我的代码错在哪一行,我找了半天,把那个方法dubug,dubug走完后也没有提示啥有用的东西,好纠结,没办法只能慢慢看日志,然后我就点开NullPointerException错误下的第一处位置:
源码如下图:

他提示这一行出了一个空指针,我发现OP_HIDE这个参数不就是隐藏的意思吗,继续下看:
mManager.hideFragment(f,transition,transitionStyle);
我想如果隐藏的fragment是一个空的,不存在的,再去隐藏他是不是就是这个原因导致的崩溃,我马上返回自己的那个切换方法内,仔细一看mCurFragment这个碎片果然是空的,应该就是这个原因,我加入了非空判断,如果是空的我就不用hide,而是用replace替换碎片,试试是否是这个原因导致的:

运行项目,果然就成功了,看来就是这个原因。哎,到最后竟然是自己大意导致的错误,真是不应该,不过知道了原因以后就不怕了。