Fragment 封裝
1.封裝佈局(比較簡單)
一般寫Fragment繼承android.support.v4.app.Fragment 重寫Fragment的生命週期實現創建過程:添加布局
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = null;
if (v == null) {
v = inflater.inflate(R.layout.common_booklist_fragment, container, false);
ButterKnife.bind(this, v);
emptyLayout = new EmptyLayout(getActivity(), listview);
}
return v;
}
BaseLazyFragment.java
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
int layoutId = getContentViewLayoutID();
if (layoutId != 0) {
return inflater.inflate(layoutId, container, false);
} else {
return super.onCreateView(inflater, container, savedInstanceState);
}
}
protected abstract int getContentViewLayoutID();//獲取佈局xml
使用的話很簡單繼承BaseLazyFragment重寫getContentViewLayoutID()就行。
2.初始化控件 或者事件總線
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
initViewsAndEvents(view);
}
protected abstract void initViewsAndEvents(View view);//初始化控件,如果使用butterknife就不需要寫findViewById;
3.懶加載
第一次可見狀態、可見狀態、第一次不可見狀態、不可見狀態
private boolean isFirstVisible = true;
private boolean isFirstInvisible = true;
private boolean isPrepared;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initPrepare();
}
private synchronized void initPrepare() {
if (isPrepared) {
onFirstUserVisible();
} else {
isPrepared = true;
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
if (isFirstVisible) {
isFirstVisible = false;
initPrepare();
} else {
onUserVisible();
}
} else {
if (isFirstInvisible) {
isFirstInvisible = false;
onFirstUserInvisible();
} else {
onUserInvisible();
}
}
}
protected abstract void onFirstUserVisible();
protected abstract void onUserVisible();
private void onFirstUserInvisible() { }
protected abstract void onUserInvisible();
4.跳轉
/**
* 封裝跳轉
*/
protected void readyGo(Class<?> clazz) {
Intent intent = new Intent(getActivity(), clazz);
startActivity(intent);
}
protected void readyGo(Class<?> clazz, Bundle bundle) {
Intent intent = new Intent(getActivity(), clazz);
if (null != bundle) {
intent.putExtras(bundle);
}
startActivity(intent);
}
protected void readyGoForResult(Class<?> clazz, int requestCode) {
Intent intent = new Intent(getActivity(), clazz);
startActivityForResult(intent, requestCode);
}
protected void readyGoForResult(Class<?> clazz, int requestCode, Bundle bundle) {
Intent intent = new Intent(getActivity(), clazz);
if (null != bundle) {
intent.putExtras(bundle);
}
startActivityForResult(intent, requestCode);
}
5.添加Toast,Dialog等等
源碼:
/**
* Created by ziyang on 16/12/28.
* Version 1.0
* 封裝Fragment懶加載
* <p>
* onCreateView() xml
* onViewCreated() butterKnife initView()
*/
public abstract class BaseLazyFragment extends Fragment {
private boolean isPrepared;
private boolean isFirstVisible = true;
private boolean isFirstInvisible = true;
private Dialog mPro;
protected MyToast myToast;
protected Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == DIALOG_SHOW) {
mPro.show();
} else {
mPro.dismiss();
}
}
};
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
int layoutId = getContentViewLayoutID();
if (layoutId != 0) {
return inflater.inflate(layoutId, container, false);
} else {
return super.onCreateView(inflater, container, savedInstanceState);
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initPrepare();
mPro = createLoadingDialog1(getActivity());
myToast = new MyToast(getActivity());
}
private synchronized void initPrepare() {
if (isPrepared) {
onFirstUserVisible();
} else {
isPrepared = true;
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
initViewsAndEvents(view);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
if (isFirstVisible) {
isFirstVisible = false;
initPrepare();
} else {
onUserVisible();
}
} else {
if (isFirstInvisible) {
isFirstInvisible = false;
onFirstUserInvisible();
} else {
onUserInvisible();
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
destroyViewAndThing();
}
protected abstract void onFirstUserVisible();//加載數據,開啓動畫/廣播..
protected abstract void onUserVisible();///開啓動畫/廣播..
private void onFirstUserInvisible() {
}
protected abstract void onUserInvisible();//暫停動畫,暫停廣播
protected abstract int getContentViewLayoutID();
protected abstract void initViewsAndEvents(View view);
protected abstract void destroyViewAndThing();//銷燬動作
public Dialog createLoadingDialog1(Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.loading_dialog, null); // 得到加載view
RelativeLayout layout = (RelativeLayout) v.findViewById(R.id.rl_probar); // 加載佈局
Dialog loadingDialog = new Dialog(context, R.style.loading_dialog); // 創建自定義樣式dialog
layout.setVisibility(View.VISIBLE);
loadingDialog.setCancelable(true);// 不可以用"返回鍵"取消
loadingDialog.setCanceledOnTouchOutside(true);
loadingDialog.setContentView(layout, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
return loadingDialog;
}
/**
* 封裝跳轉
*/
protected void readyGo(Class<?> clazz) {
Intent intent = new Intent(getActivity(), clazz);
startActivity(intent);
}
protected void readyGo(Class<?> clazz, Bundle bundle) {
Intent intent = new Intent(getActivity(), clazz);
if (null != bundle) {
intent.putExtras(bundle);
}
startActivity(intent);
}
protected void readyGoForResult(Class<?> clazz, int requestCode) {
Intent intent = new Intent(getActivity(), clazz);
startActivityForResult(intent, requestCode);
}
protected void readyGoForResult(Class<?> clazz, int requestCode, Bundle bundle) {
Intent intent = new Intent(getActivity(), clazz);
if (null != bundle) {
intent.putExtras(bundle);
}
startActivityForResult(intent, requestCode);
}
}
當然還有MVP的封裝:
public abstract class BaseFragment<T extends BasePresenter> extends SupportFragment {
private final String TAG = getClass().getSimpleName();
protected T mPresenter;
protected Context mContext;
protected View rootView;
protected Unbinder unbinder;
private boolean isViewPrepared; // 標識fragment視圖已經初始化完畢
private boolean hasFetchData; // 標識已經觸發過懶加載數據
@Override
public void onAttach(Context mContext) {
super.onAttach(mContext);
KL.d(this.getClass(), getName() + "------>onAttach");
if (mContext != null) {
this.mContext = mContext;
} else {
this.mContext = getActivity();
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
KL.d(this.getClass(), getName() + "------>onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
KL.d(this.getClass(), getName() + "------>onCreateView");
if (rootView == null) {
rootView = inflater.inflate(getLayout(), container, false);
}
ViewGroup parent = (ViewGroup) rootView.getParent();
if (parent != null) {
parent.removeView(rootView);
}
unbinder = ButterKnife.bind(this, rootView);
initView(inflater);
EventBus.getDefault().register(this);
setTitleHeight(rootView);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
KL.d(this.getClass(), getName() + "------>onActivityCreated");
initEvent();
}
@Override
public void onStart() {
super.onStart();
KL.d(this.getClass(), getName() + "------>onStart");
}
@Override
public void onResume() {
super.onResume();
KL.d(this.getClass(), getName() + "------>onResume");
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
KL.d(this.getClass(), getName() + "------>onViewCreated");
isViewPrepared = true;
lazyFetchDataIfPrepared();
}
@Override
public void onPause() {
super.onPause();
KL.d(this.getClass(), getName() + "------>onPause");
}
@Override
public void onStop() {
super.onStop();
KL.d(this.getClass(), getName() + "------>onStop");
}
@Override
public void onDestroyView() {
EventBus.getDefault().unregister(this);
super.onDestroyView();
KL.d(this.getClass(), getName() + "------>onDestroyView");
// view被銷燬後,將可以重新觸發數據懶加載,因爲在viewpager下,fragment不會再次新建並走onCreate的生命週期流程,將從onCreateView開始
hasFetchData = false;
isViewPrepared = false;
mPresenter = null;
}
@Override
public void onDestroy() {
super.onDestroy();
KL.d(this.getClass(), getName() + "------>onDestroy");
if (unbinder != null)
unbinder.unbind();
}
@Override
public void onDetach() {
super.onDetach();
KL.d(this.getClass(), getName() + "------>onDetach");
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.v(TAG, getClass().getName() + "------>isVisibleToUser = " + isVisibleToUser);
if (isVisibleToUser) {
lazyFetchDataIfPrepared();
}
}
private void lazyFetchDataIfPrepared() {
// 用戶可見fragment && 沒有加載過數據 && 視圖已經準備完畢
if (getUserVisibleHint() && !hasFetchData && isViewPrepared) {
hasFetchData = true;
lazyFetchData();
}
}
/**
* 懶加載的方式獲取數據,僅在滿足fragment可見和視圖已經準備好的時候調用一次
*/
protected void lazyFetchData() {
Log.v(TAG, getClass().getName() + "------>lazyFetchData");
}
public String getName() {
return BaseFragment.class.getName();
}
protected abstract int getLayout();
protected void initView(LayoutInflater inflater) {
}
protected void initEvent() {
}
}