@wangwangheng
2014-11-23T17:12:11.000000Z
字数 2502
阅读 9135
Fragment
Fragment问题的处理:
11-23 23:40:26.037: E/AndroidRuntime(17186): FATAL EXCEPTION: main11-23 23:40:26.037: E/AndroidRuntime(17186): java.lang.IllegalStateException: Activity has been destroyed11-23 23:40:26.037: E/AndroidRuntime(17186): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1376)11-23 23:40:26.037: E/AndroidRuntime(17186): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)11-23 23:40:26.037: E/AndroidRuntime(17186): at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
在使用嵌套的Fragment的时候,一定要检查执行嵌套的Fragment是否已经被Detach掉了,特别是在执行完网络操作或者其他耗时操作之后执行这种替换,但是不要使用Fragment的默认的isDetach()方法来检查,因为不一定有用,我们要自己来写这个逻辑:
// Fragment是否已经被Detach了private boolean detached = false;@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);// 在onAttached()中执行修改detach属性detached = false;}/*** 这个方法让外部能够访问detached属性*/public boolean isFragmentDetached(){return detached;}@Overridepublic void onDetach() {super.onDetach();// 在onDetach()中执行修改detach属性detached = true;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);}}
/*** initBanner:初始化banner. <br/>* @author* @param bannerList*/private void initBanner(ArrayList<Banner> bannerList) {// 如果已经detached了,则不再执行任何操作if(view.isFragmentDetached()){return;}view.addHeaderView();DebugLog.e("xinye", "###########hehe::::" + view.isFragmentDetached());ArrayList<Banner> bannerList1= new ArrayList<Banner>();String[] imgs = {"http://t1.qpic.cn/mblogpic/b62604c53322c5a31950/2000","http://t1.qpic.cn/mblogpic/093bc5fc7cc898d05476/2000","http://t2.qpic.cn/mblogpic/ce7ae27d0716d1d109e4/2000","http://t1.qpic.cn/mblogpic/f576dd220da54c7081fa/2000"};for(int i = 0;i < 4;i++){Banner b = new Banner();b.setId(String.valueOf(i + 100));b.setImgWidth(720);b.setImgHeight(300);b.setImgUrl(imgs[i]);bannerList1.add(b);}FragmentManager manager = view.getChildCategoryFragmentManager();FragmentTransaction transaction = manager.beginTransaction();BannerFragment banner = new BannerFragment();banner.setBannerList(bannerList1);banner.setCategoryId(parentCategoryId);banner.setMainViewOperatorDelegate(view.getOperatorDelegate());transaction.replace(R.id.categoryChildHeaderView, banner);transaction.commitAllowingStateLoss();}