You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
5.1 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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() {
}
}