利用ViewStub完成对BaseFragment的封装
ViewStub就是一个宽高都为0的一个View,它默认是不可见的,只有通过调用setVisibility函数或者Inflate函数才会将其要装载的目标布局给加载出来,从而达到延迟加载的效果,这个要被加载的布局通过android:layout属性来设置。例如我们通过一个ViewStub来惰性加载一个消息流的评论列表,因为一个帖子可能并没有评论,此时我可以不加载这个评论的ListView,只有当有评论时我才把它加载出来,这样就去除了加载ListView带来的资源消耗以及延时,
public abstract class BaseFragment extends Fragment { public View view; protected Context mContext; @Override public void onAttach(Context context) { super.onAttach(context); mContext=context; } @Override public void onDetach() { super.onDetach(); mContext=null; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (view!=null){ ViewGroup viewGroup= (ViewGroup) view.getParent(); if (viewGroup!=null) viewGroup.removeView(view); }else{ view=inflater.inflate(getLayoutId(),container,false); onBindViewBefore(view); if (savedInstanceState!=null){ onRestartInstance(savedInstanceState); } initView(view); initData(); } return view; } protected void initData(){}; protected void initView(View view){}; protected void onRestartInstance(Bundle savedInstanceState){ }; protected void onBindViewBefore(View view){ //do something... }; protected abstract int getLayoutId(); }
public abstract class BaseTitleFragment extends BaseFragment{ protected Toolbar toolbar; protected TextView tv_title; @Override protected int getLayoutId() { return R.layout.activity_base; } @Override protected void onBindViewBefore(View view) { super.onBindViewBefore(view); ViewStub stub= (ViewStub) view.findViewById(R.id.lay_content); stub.setLayoutResource(getContentLayoutId()); stub.inflate(); } @Override protected void initView(View view) { super.initView(view); toolbar= (Toolbar) view.findViewById(R.id.toolbar); toolbar.inflateMenu(R.menu.menu_main); toolbar.setOnMenuItemClickListener(onMenuItemClickListener); tv_title= (TextView) view.findViewById(R.id.tv_title); tv_title.setText(getTitle()); } protected String getTitle() { return ""; } protected abstract int getContentLayoutId(); Toolbar.OnMenuItemClickListener onMenuItemClickListener=new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()){ case R.id.action_edit: Toast.makeText(getContext(),"",Toast.LENGTH_SHORT).show(); break; } return true; } }; }<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <include layout="@layout/toolbar" /> <ViewStub android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/lay_content"/> </LinearLayout>