Android Fragment内嵌Fragment页面不刷新数据问题

来源:互联网 发布:seo臻系统 编辑:程序博客网 时间:2024/04/29 16:05

解决Fragment内嵌Fragment页面数据无法刷新的问题

在父Fragment中重写

@Override

public void onDestroyView() {

super.onDestroyView();

try {

Field childFragmentManager = Fragment.class

.getDeclaredField("mChildFragmentManager");

childFragmentManager.setAccessible(true);

childFragmentManager.set(this,null);


} catch (NoSuchFieldExceptione) {

throw new RuntimeException(e);

} catch (IllegalAccessExceptione) {

throw new RuntimeException(e);

}

}

因为Fragment切换时的生命周期

06-11 13:29:07.023: I/Fragment(3385): Parent onAttach

06-11 13:29:07.023: I/Fragment(3385): Parent onCreate

06-11 13:29:07.023: I/Fragment(3385): Parent onCreateView

06-11 13:29:07.034: I/Fragment(3385): Parent onActivityCreated

06-11 13:29:07.034: I/Fragment(3385): Parent onStart

06-11 13:29:07.034: I/Fragment(3385): Parent onResume

06-11 13:29:07.040: I/Fragment(3385): Child A onAttach

06-11 13:29:07.040: I/Fragment(3385): Child  A onCreate

06-11 13:29:07.045: I/Fragment(3385): Child  A onActivityCreated

06-11 13:29:07.049: I/Fragment(3385): Child  A onStart

06-11 13:29:07.049: I/Fragment(3385): Child  A onResume

06-11 13:29:07.050: I/Fragment(3385): Child B onAttach

06-11 13:29:07.050: I/Fragment(3385): Child  B onCreate

06-11 13:29:07.057: I/Fragment(3385): Child  B  onActivityCreated

06-11 13:29:07.061: I/Fragment(3385): Child  B onStart

06-11 13:29:07.061: I/Fragment(3385): Child  B onResume

06-11 13:29:09.197: I/Fragment(3385): Child C onAttach

06-11 13:29:09.197: I/Fragment(3385): Child  C onCreate

06-11 13:29:09.206: I/Fragment(3385): Child  C  onActivityCreated

06-11 13:29:09.207: I/Fragment(3385): Child  C onStart

06-11 13:29:09.209: I/Fragment(3385): Child  C onResume

06-11 13:29:09.550: I/Fragment(3385): Child  A onPause

06-11 13:29:09.550: I/Fragment(3385): Child A onStop

06-11 13:29:09.550: I/Fragment(3385): Child  A onDestroyView

06-11 13:29:12.673: I/Fragment(3385): Child B onPause

06-11 13:29:12.675: I/Fragment(3385): Child C onPause

06-11 13:29:12.677: I/Fragment(3385): Parent onPause

06-11 13:29:12.677: I/Fragment(3385): Child B onStop

06-11 13:29:12.677: I/Fragment(3385): Child  C onStop

06-11 13:29:12.677: I/Fragment(3385): Parent onStop

06-11 13:29:12.680: I/Fragment(3385): Child  B onDestroyView

06-11 13:29:12.680: I/Fragment(3385): Child  C onDestroyView

06-11 13:29:12.681: I/Fragment(3385): Parent onDestroyView

06-11 13:29:14.456: I/Fragment(3385): Parent onCreateView

06-11 13:29:14.458: I/Fragment(3385): Parent onActivityCreated

06-11 13:29:14.460: I/Fragment(3385): Parent onStart

06-11 13:29:14.460: I/Fragment(3385): Parent onResume

06-11 13:29:14.471: I/Fragment(3385): Child C onAttach

06-11 13:29:14.471: I/Fragment(3385): Child  C onCreate

06-11 13:29:14.478: I/Fragment(3385): Child  C  onActivityCreated

06-11 13:29:14.478: I/Fragment(3385): Child  C onStart

06-11 13:29:14.478: I/Fragment(3385): Child  C onResume

06-11 13:29:14.478: I/Fragment(3385): Child B onAttach

06-11 13:29:14.478: I/Fragment(3385): Child  B onCreate

06-11 13:29:14.502: I/Fragment(3385): Child  B  onActivityCreated

06-11 13:29:14.506: I/Fragment(3385): Child  B onStart

06-11 13:29:14.506: I/Fragment(3385): Child  B onResume

06-11 13:29:16.365: I/Fragment(3385): Child A onAttach

06-11 13:29:16.365: I/Fragment(3385): Child  A onCreate

06-11 13:29:16.368: I/Fragment(3385): Child  A onActivityCreated

06-11 13:29:16.375: I/Fragment(3385): Child  A onStart

06-11 13:29:16.375: I/Fragment(3385): Child  A onResume


生命周期数据证明,Fragment首次加载的时候触发五个生命周期,onAttach(), onCreate(), onActivityCreated(), onStart(), onResume(),  在Fragment失去焦点的时候触发三个生命周期onPause(), onStop(), onDestroyView(), 在这个时候Fragment虽然View被销毁,但是数据依旧被保存。
在父Fragment切换到同级页面的时候会执行子Fragment的OnStop(), 父Fragment的OnStop(),子Fragment的onDestroyView(), 父Fragment的onDestroyView()

06-11 13:29:12.677: I/Fragment(3385): Child B onStop

06-11 13:29:12.677: I/Fragment(3385): Child  C onStop

06-11 13:29:12.677: I/Fragment(3385): Parent onStop

06-11 13:29:12.680: I/Fragment(3385): Child  B onDestroyView

06-11 13:29:12.680: I/Fragment(3385): Child  C onDestroyView

06-11 13:29:12.681: I/Fragment(3385): Parent onDestroyView


在重新让父Fragment获取焦点的时候触发的生命周期

06-11 13:29:14.458: I/Fragment(3385): Parent onActivityCreated

06-11 13:29:14.460: I/Fragment(3385): Parent onStart

06-11 13:29:14.460: I/Fragment(3385): Parent onResume

06-11 13:29:14.478: I/Fragment(3385): Child  C  onActivityCreated

06-11 13:29:14.478: I/Fragment(3385): Child  C onStart

06-11 13:29:14.478: I/Fragment(3385): Child  C onResume

06-11 13:29:14.502: I/Fragment(3385): Child  B  onActivityCreated

06-11 13:29:14.506: I/Fragment(3385): Child  B onStart

06-11 13:29:14.506: I/Fragment(3385): Child  B onResume


在这个时候因为子Fragment被缓存了,但是Fragment的开发者却没有处理这个Fragment内嵌Fragment数据的问题,所以数据是无法刷新的,想要达到数据刷新的目的,可以重写帖子重置getChildFragmentManager的数据。我是在OnDestroyView中完成的重写。这样就可以完成预期的数据刷新了


0 0
原创粉丝点击