[关闭]
@wangwangheng 2014-11-23T17:12:11.000000Z 字数 2502 阅读 8772

嵌套的Fragment出错——java.lang.IllegalStateException: Activity has been destroyed

Fragment


Fragment问题的处理:

  1. 11-23 23:40:26.037: E/AndroidRuntime(17186): FATAL EXCEPTION: main
  2. 11-23 23:40:26.037: E/AndroidRuntime(17186): java.lang.IllegalStateException: Activity has been destroyed
  3. 11-23 23:40:26.037: E/AndroidRuntime(17186): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1376)
  4. 11-23 23:40:26.037: E/AndroidRuntime(17186): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
  5. 11-23 23:40:26.037: E/AndroidRuntime(17186): at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)

在使用嵌套的Fragment的时候,一定要检查执行嵌套的Fragment是否已经被Detach掉了,特别是在执行完网络操作或者其他耗时操作之后执行这种替换,但是不要使用Fragment的默认的isDetach()方法来检查,因为不一定有用,我们要自己来写这个逻辑:

  1. // Fragment是否已经被Detach了
  2. private boolean detached = false;
  3. @Override
  4. public void onAttach(Activity activity) {
  5. super.onAttach(activity);
  6. // 在onAttached()中执行修改detach属性
  7. detached = false;
  8. }
  9. /**
  10. * 这个方法让外部能够访问detached属性
  11. */
  12. public boolean isFragmentDetached(){
  13. return detached;
  14. }
  15. @Override
  16. public void onDetach() {
  17. super.onDetach();
  18. // 在onDetach()中执行修改detach属性
  19. detached = true;
  20. try {
  21. Field childFragmentManager = Fragment.class
  22. .getDeclaredField("mChildFragmentManager");
  23. childFragmentManager.setAccessible(true);
  24. childFragmentManager.set(this, null);
  25. } catch (NoSuchFieldException e) {
  26. throw new RuntimeException(e);
  27. } catch (IllegalAccessException e) {
  28. throw new RuntimeException(e);
  29. }
  30. }
  1. /**
  2. * initBanner:初始化banner. <br/>
  3. * @author
  4. * @param bannerList
  5. */
  6. private void initBanner(ArrayList<Banner> bannerList) {
  7. // 如果已经detached了,则不再执行任何操作
  8. if(view.isFragmentDetached()){
  9. return;
  10. }
  11. view.addHeaderView();
  12. DebugLog.e("xinye", "###########hehe::::" + view.isFragmentDetached());
  13. ArrayList<Banner> bannerList1= new ArrayList<Banner>();
  14. String[] imgs = {
  15. "http://t1.qpic.cn/mblogpic/b62604c53322c5a31950/2000",
  16. "http://t1.qpic.cn/mblogpic/093bc5fc7cc898d05476/2000",
  17. "http://t2.qpic.cn/mblogpic/ce7ae27d0716d1d109e4/2000",
  18. "http://t1.qpic.cn/mblogpic/f576dd220da54c7081fa/2000"
  19. };
  20. for(int i = 0;i < 4;i++){
  21. Banner b = new Banner();
  22. b.setId(String.valueOf(i + 100));
  23. b.setImgWidth(720);
  24. b.setImgHeight(300);
  25. b.setImgUrl(imgs[i]);
  26. bannerList1.add(b);
  27. }
  28. FragmentManager manager = view.getChildCategoryFragmentManager();
  29. FragmentTransaction transaction = manager.beginTransaction();
  30. BannerFragment banner = new BannerFragment();
  31. banner.setBannerList(bannerList1);
  32. banner.setCategoryId(parentCategoryId);
  33. banner.setMainViewOperatorDelegate(view.getOperatorDelegate());
  34. transaction.replace(R.id.categoryChildHeaderView, banner);
  35. transaction.commitAllowingStateLoss();
  36. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注