Fragment报错记录

最近维护的项目里bugly中fragment报了几种错误,记录一下:

Fragment already active
Fragment报错记录_第1张图片

出现场景:这是Fragment调用setArguments()方法时报的错误。
原因:当Android堆栈正在删除Fragment而删除操作没有完成时,也就是Fragment仍保持active又被重新调用了setArguments()方法,常见操作是快速连续点击调用这个Fragment的操作.。
解决方法:使用Fragment的isRemoving()方法来判断该Fragment是否还存在堆栈中,如果true,那么Fragment依然active,可以复写相同地址下的Arguments来解决;如果false,那么说明Fragment not active,可以直接调用setArguments()。

if (fragment.isRemoving()) {
    fragment.getArguments().putAll(bundle);
} else {
    fragment.setArguments(bundle);
}

如果是全局的dialogfragment,可以通过判断fragment是否为null来设置。

Fragment already added
Fragment报错记录_第2张图片

出现场景: Fragment:快速双击调用FragmentTransaction.add()或者DialogFragment.show()方法添加fragment,而fragment不是每次单独生成的,就会引起这个异常。
原因: fragment不是每次单独生成的,就会引起这个异常;show()内部调用了FragmentTransaction.add()方法。
解决方法: Fragment:在add()方法时候,先判断fragmentA.isAdded()

if(!fragmentA.isAdded()){
        FragmentManager manager =getFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        ft.add(fragment, "tag");
        ft.commit();
}

DialogFragment:重写show方法,根据tag来获取fragment进行判断:

@Override
public void show(FragmentManager manager, String tag) {
    Fragment fragment = manager.findFragmentByTag(tag);
    if (fragment == null || !fragment.isAdded()) {
        super.show(manager, tag);
    }
}

Fragment MyFragment not attached to Activity
出现该异常,是因为Fragment的还没有Attach到Activity时,调用了如getResource()等需要上下文Context的方法。
解决方法:
1.将调用的这些方法写在OnStart()中。
2.在调用:getResources().getString(R.xx.xxx); 之前增加一个判断isAdded();

Can not perform this action after onSaveInstanceSate
Fragment报错记录_第3张图片
原因: 用户在onSaveInstanceState期间操作了fragment,比如后退,切换操作等
解决办法: commitAllowingStateLoss()去代替commit()

你可能感兴趣的:(Android)