|
|
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同理
|
|
|
* <p>
|
|
|
* 使用此方法时请注意调用时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() {
|
|
|
|
|
|
}
|
|
|
}
|