@wangwangheng
2014-11-23T17:12:11.000000Z
字数 2502
阅读 8976
Fragment
Fragment问题的处理:
11-23 23:40:26.037: E/AndroidRuntime(17186): FATAL EXCEPTION: main
11-23 23:40:26.037: E/AndroidRuntime(17186): java.lang.IllegalStateException: Activity has been destroyed
11-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;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// 在onAttached()中执行修改detach属性
detached = false;
}
/**
* 这个方法让外部能够访问detached属性
*/
public boolean isFragmentDetached(){
return detached;
}
@Override
public 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();
}