package com.rehome.meetingbook.base; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; /** * Created by ruihong on 2018/4/20. */ public abstract class BaseLazyFragment extends Fragment { private boolean isPrepared; protected View mRootView; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mRootView = inflater.inflate(getContentViewId(), container, false); //绑定到butterKnife return mRootView; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //如果要使用eventBus请将此方法返回true initPrepare(); } @Override public void onViewStateRestored(@Nullable Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); } @Override public void onDestroyView() { super.onDestroyView(); } @Override public void onDestroy() { super.onDestroy(); this.mRootView = null; } /** * 初始化视图 * * @return the int */ protected abstract int getContentViewId(); /** * 初始化控件 */ protected abstract void initView(); /** * 初始话数据 */ protected abstract void initData(); /** * 初始化监听 */ protected abstract void initListener(); /** * 此方法是让外部调用使fragment做一些操作的,比如说外部的activity想让fragment对象执行一些方法, * 建议在有多个需要让外界调用的方法时,统一传bundle,里面存一个what字段,来区分不同的方法,在setData * 方法中就可以switch做不同的操作,这样就可以用统一的入口方法做不同的事,和message同理 *
* 使用此方法时请注意调用时fragment的生命周期,如果调用此setData方法时onActivityCreated * 还没执行,setData里调用presenter的方法时,是会报空的,因为dagger注入是在onActivityCreated * 方法中执行的,如果要做一些初始化操作,可以不必让外部调setData,在内部onActivityCreated中 * 初始化就可以了 * * @param data */ public void setData(Object data) { } /** * 使用此方法时请注意调用时fragment的生命周期,如果调用此setData方法时onActivityCreated * 还没执行,setData里调用presenter的方法时,是会报空的,因为dagger注入是在onActivityCreated * 方法中执行的,如果要做一些初始化操作,可以不必让外部调setData,在内部onActivityCreated中 * 初始化就可以了 */ public void setData() { } /** * 第一次onResume中的调用onUserVisible避免操作与onFirstUserVisible操作重复 */ private boolean isFirstResume = true; @Override public void onResume() { super.onResume(); if (isFirstResume) { isFirstResume = false; return; } if (getUserVisibleHint()) { onUserVisible(); } } @Override public void onPause() { super.onPause(); if (getUserVisibleHint()) { onUserInvisible(); } } private boolean isFirstVisible = true; private boolean isFirstInvisible = 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(); } } } public synchronized void initPrepare() { if (isPrepared) { onFirstUserVisible(); } else { isPrepared = true; } } /** * 第一次fragment可见(进行初始化工作) */ public void onFirstUserVisible() { initView(); initData(); initListener(); } /** * fragment可见(切换回来或者onResume) */ public void onUserVisible() { } /** * 第一次fragment不可见(不建议在此处理事件) */ public void onFirstUserInvisible() { } /** * fragment不可见(切换掉或者onPause) */ public void onUserInvisible() { } }