系统会在片段首次绘制其用户界面时调用onCreateView方法。 要想为您的片段绘制 UI,您从此方法中返回的 View 必须是片段布局的根视图。如果片段未提供 UI,您可以返回 null。
Fragment默认有预加载的功能,默认是预加载左右各一个fragment实例,在预加载的时候会调用onCreateView 方法,当切换Fragment的时候会调用onDestoryView, 但是并不会调用onDestory方法销毁掉fragmen实例。再重新来回切换多个Fragment的时候会重新调用OnCreateView绘制界面。这样就存在多次绘制初始化视图的可能。
解决办法如下(直接贴上相关代码分析):
public class OwnerFragment extends BaseFragment {
private View rootView; // 设置为全局的
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (null != rootView) {
ViewGroup parent = (ViewGroup) rootView.getParent();
if (null != parent) {
parent.removeView(rootView);
}
} else { // 如ongoing果rootView为空 ,就实例化该视图
rootView = inflater.inflate(R.layout.owner_theme_idle_fragment, container,false);
return rootView;
}
当rootView不为空时,需要做以下处理,把rootview已经绑定的父视图去掉。因为一个视图只能只能有一个父控件(rootView 经过这个方法返回之后会添加到fragment的视图上)
if (null != rootView) {
ViewGroup parent = (ViewGroup) rootView.getParent();
if (null != parent) {
parent.removeView(rootView);
}
}