androdi Fragment删除和隐藏空碎片引发的血案(at android.support.v4.app.BackStackRecord.run)

今天在做导航功能的时候用到了多个碎片,然后对碎片进行切换管理,我的代码是这样:

androdi Fragment删除和隐藏空碎片引发的血案(at android.support.v4.app.BackStackRecord.run)_第1张图片
有误代码

最代码的倒数第五行:

baseActivity.getSupportFragmentManager().beginTransaction().hide(mCurFragment).show(fragment).commit();

意思是隐藏上一个碎片显示传入进来的碎片,这样写是没错的,但是我在mainActivity中一创建的时候就调用这个方法把第一个碎片显示出来 mainPresenter.selectFragment(0);这个时候就发送了一个错误,如图:

androdi Fragment删除和隐藏空碎片引发的血案(at android.support.v4.app.BackStackRecord.run)_第2张图片
错误日志

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

源码如下图:

源码

他提示这一行出了一个空指针,我发现OP_HIDE这个参数不就是隐藏的意思吗,继续下看:

mManager.hideFragment(f,transition,transitionStyle);

我想如果隐藏的fragment是一个空的,不存在的,再去隐藏他是不是就是这个原因导致的崩溃,我马上返回自己的那个切换方法内,仔细一看mCurFragment这个碎片果然是空的,应该就是这个原因,我加入了非空判断,如果是空的我就不用hide,而是用replace替换碎片,试试是否是这个原因导致的:

androdi Fragment删除和隐藏空碎片引发的血案(at android.support.v4.app.BackStackRecord.run)_第3张图片
修改后的代码

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

总结:fragment隐藏和删除的时候被删除、隐藏的fragment是不能为空的。

你可能感兴趣的:(androdi Fragment删除和隐藏空碎片引发的血案(at android.support.v4.app.BackStackRecord.run))