429 lines
12 KiB
Java
429 lines
12 KiB
Java
package com.zlm.hp.fragment;
|
|
|
|
import android.content.Context;
|
|
import android.os.Bundle;
|
|
import android.os.Handler;
|
|
import android.os.HandlerThread;
|
|
import android.os.Looper;
|
|
import android.os.Message;
|
|
import android.os.Process;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.ViewParent;
|
|
import android.view.ViewStub;
|
|
import android.view.animation.Animation;
|
|
import android.view.animation.AnimationUtils;
|
|
import android.view.animation.LinearInterpolator;
|
|
import android.widget.FrameLayout;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.RelativeLayout;
|
|
|
|
import androidx.constraintlayout.widget.ConstraintLayout;
|
|
import androidx.core.content.ContextCompat;
|
|
import androidx.fragment.app.Fragment;
|
|
|
|
import com.zlm.hp.handler.WeakRefHandler;
|
|
import com.zlm.hp.ui.R;
|
|
import com.zlm.hp.util.AppBarUtil;
|
|
import com.zlm.hp.util.ColorUtil;
|
|
import com.zlm.hp.util.ContextUtil;
|
|
import com.zlm.hp.widget.IconfontTextView;
|
|
|
|
|
|
/**
|
|
* Created by zhangliangming on 2018-08-11.
|
|
*/
|
|
|
|
public abstract class BaseFragment extends Fragment {
|
|
/**
|
|
* 是否是第一次可视
|
|
*/
|
|
private boolean mIsFristVisibleToUser;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
public Context mContext;
|
|
|
|
/**
|
|
* 子线程用于执行耗时任务
|
|
*/
|
|
public WeakRefHandler mWorkerHandler;
|
|
//创建异步HandlerThread
|
|
private HandlerThread mHandlerThread;
|
|
/**
|
|
* 处理ui任务
|
|
*/
|
|
public WeakRefHandler mUIHandler;
|
|
/**
|
|
* 状态栏背景颜色
|
|
*/
|
|
private int mStatusBarViewBG = -1;
|
|
|
|
private final int SHOWLOADINGVIEW = 1000;
|
|
private final int SHOWCONTENTVIEW = 1001;
|
|
private final int SHOWNONETVIEW = 1002;
|
|
|
|
/**
|
|
* 是否添加
|
|
*/
|
|
private boolean isAddStatusBarView = true;
|
|
|
|
|
|
/**
|
|
* 内容布局
|
|
*/
|
|
private ViewStub mContentContainer;
|
|
|
|
/**
|
|
* 加载中布局
|
|
*/
|
|
private ViewStub mLoadingContainer;
|
|
/**
|
|
* 加载图标
|
|
*/
|
|
private IconfontTextView mLoadImgView;
|
|
|
|
/**
|
|
* 旋转动画
|
|
*/
|
|
private Animation rotateAnimation;
|
|
|
|
/**
|
|
* 无网络
|
|
*/
|
|
private ViewStub mNetContainer;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
private ConstraintLayout mNetBGLayout;
|
|
|
|
private RefreshListener mRefreshListener;
|
|
|
|
/**
|
|
* 标题视图
|
|
*/
|
|
private int mTitleViewId = R.layout.layout_title;
|
|
|
|
/**
|
|
* 初始化
|
|
*/
|
|
private void init() {
|
|
this.mIsFristVisibleToUser = false;
|
|
this.mContext = ContextUtil.getContext();
|
|
//创建ui handler
|
|
mUIHandler = new WeakRefHandler(Looper.getMainLooper(), this, new Handler.Callback() {
|
|
@Override
|
|
public boolean handleMessage(Message msg) {
|
|
switch (msg.what) {
|
|
case SHOWCONTENTVIEW:
|
|
showContentViewHandler();
|
|
break;
|
|
case SHOWLOADINGVIEW:
|
|
showLoadingViewHandler();
|
|
break;
|
|
case SHOWNONETVIEW:
|
|
showNoNetViewHandler();
|
|
break;
|
|
default:
|
|
handleUIMessage(msg);
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
});
|
|
|
|
//创建异步HandlerThread
|
|
mHandlerThread = new HandlerThread("loadFragmentData", Process.THREAD_PRIORITY_BACKGROUND);
|
|
//必须先开启线程
|
|
mHandlerThread.start();
|
|
//子线程Handler
|
|
mWorkerHandler = new WeakRefHandler(mHandlerThread.getLooper(), this, new Handler.Callback() {
|
|
@Override
|
|
public boolean handleMessage(Message msg) {
|
|
handleWorkerMessage(msg);
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
Bundle savedInstanceState) {
|
|
init();
|
|
mStatusBarViewBG = ColorUtil.parserColor(ContextCompat.getColor(mContext, R.color.defColor));
|
|
preInitStatusBar();
|
|
View mainView = inflater.inflate(R.layout.fragment_base, container, false);
|
|
|
|
//添加主布局
|
|
mContentContainer = mainView.findViewById(R.id.viewstub_content_container);
|
|
mContentContainer.setLayoutResource(setContentLayoutResID());
|
|
mContentContainer.inflate();
|
|
mContentContainer.setVisibility(View.GONE);
|
|
|
|
//添加titleview
|
|
View titleView = inflater.inflate(mTitleViewId, container, false);
|
|
LinearLayout titleViewLL = mainView.findViewById(R.id.title_view_parent);
|
|
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(-1, -1);
|
|
titleViewLL.addView(titleView,llp);
|
|
|
|
if (isAddStatusBarView) {
|
|
initStatusBar(mainView);
|
|
}
|
|
initLoadingView(mainView);
|
|
initNoNetView(mainView);
|
|
|
|
//初始化view相关数据
|
|
initViews(mainView, savedInstanceState);
|
|
|
|
//初始化是否可视
|
|
if (!mIsFristVisibleToUser && getUserVisibleHint()) {
|
|
mIsFristVisibleToUser = true;
|
|
isFristVisibleToUser();
|
|
}
|
|
return mainView;
|
|
}
|
|
|
|
@Override
|
|
public void onDestroyView() {
|
|
|
|
//移除队列任务
|
|
if (mUIHandler != null) {
|
|
mUIHandler.removeCallbacksAndMessages(null);
|
|
}
|
|
|
|
//移除队列任务
|
|
if (mWorkerHandler != null) {
|
|
mWorkerHandler.removeCallbacksAndMessages(null);
|
|
}
|
|
|
|
//关闭线程
|
|
if (mHandlerThread != null)
|
|
mHandlerThread.quit();
|
|
|
|
super.onDestroyView();
|
|
}
|
|
|
|
/**
|
|
* 初始化状态栏
|
|
*
|
|
* @param
|
|
*/
|
|
private void initStatusBar(View mainView) {
|
|
boolean isAddStatusBar = AppBarUtil.isAddStatusBar();
|
|
//添加状态栏
|
|
addStatusBar(mainView, isAddStatusBar);
|
|
}
|
|
|
|
/**
|
|
* 添加状态栏
|
|
*
|
|
* @param isAddStatusBar
|
|
*/
|
|
private void addStatusBar(View mainView, boolean isAddStatusBar) {
|
|
View statusBarView = mainView.findViewById(R.id.status_bar_view);
|
|
if (statusBarView == null) return;
|
|
if (!isAddStatusBar) {
|
|
statusBarView.setVisibility(View.GONE);
|
|
return;
|
|
}
|
|
|
|
|
|
ViewParent parentView = statusBarView.getParent();
|
|
int statusBarViewHeight = AppBarUtil.getStatusBarHeight(mContext);
|
|
|
|
if (parentView instanceof ConstraintLayout) {
|
|
ConstraintLayout.LayoutParams clp = new ConstraintLayout.LayoutParams(-1, statusBarViewHeight);
|
|
statusBarView.setLayoutParams(clp);
|
|
} else if (parentView instanceof LinearLayout) {
|
|
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(-1, statusBarViewHeight);
|
|
statusBarView.setLayoutParams(llp);
|
|
} else if (parentView instanceof RelativeLayout) {
|
|
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(-1, statusBarViewHeight);
|
|
statusBarView.setLayoutParams(rlp);
|
|
} else if (parentView instanceof FrameLayout) {
|
|
FrameLayout.LayoutParams flp = new FrameLayout.LayoutParams(-1, statusBarViewHeight);
|
|
statusBarView.setLayoutParams(flp);
|
|
} else if (parentView instanceof ViewGroup) {
|
|
ViewGroup.LayoutParams vplp = new ViewGroup.LayoutParams(-1, statusBarViewHeight);
|
|
statusBarView.setLayoutParams(vplp);
|
|
}
|
|
|
|
statusBarView.setVisibility(View.VISIBLE);
|
|
statusBarView.setBackgroundColor(mStatusBarViewBG);
|
|
}
|
|
|
|
/**
|
|
* 初始化view之前
|
|
*/
|
|
protected void preInitStatusBar() {
|
|
|
|
}
|
|
|
|
/**
|
|
* 初始化加载界面
|
|
*/
|
|
private void initLoadingView(View mainView) {
|
|
mLoadingContainer = mainView.findViewById(R.id.viewstub_loading_container);
|
|
mLoadingContainer.inflate();
|
|
mLoadImgView = mainView.findViewById(R.id.load_img);
|
|
rotateAnimation = AnimationUtils.loadAnimation(getContext(),
|
|
R.anim.anim_rotate);
|
|
rotateAnimation.setInterpolator(new LinearInterpolator());// 匀速
|
|
mLoadImgView.startAnimation(rotateAnimation);
|
|
//mLoadingContainer.setVisibility(View.GONE);
|
|
|
|
}
|
|
|
|
/**
|
|
* 显示加载窗口
|
|
*/
|
|
public void showLoadingView() {
|
|
mUIHandler.sendEmptyMessage(SHOWLOADINGVIEW);
|
|
}
|
|
|
|
/**
|
|
* 显示加载窗口
|
|
*/
|
|
private void showLoadingViewHandler() {
|
|
if (mNetContainer != null)
|
|
mNetContainer.setVisibility(View.GONE);
|
|
mContentContainer.setVisibility(View.GONE);
|
|
if (mLoadingContainer != null) {
|
|
mLoadingContainer.setVisibility(View.VISIBLE);
|
|
mLoadImgView.clearAnimation();
|
|
mLoadImgView.startAnimation(rotateAnimation);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 初始化没网络界面
|
|
*/
|
|
private void initNoNetView(View mainView) {
|
|
//
|
|
mNetContainer = mainView.findViewById(R.id.viewstub_net_container);
|
|
mNetContainer.inflate();
|
|
mNetBGLayout = mainView.findViewById(R.id.net_layout);
|
|
mNetBGLayout.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
if (mRefreshListener != null) {
|
|
mRefreshListener.refresh();
|
|
}
|
|
}
|
|
});
|
|
mNetContainer.setVisibility(View.GONE);
|
|
}
|
|
|
|
/**
|
|
* 显示无网络界面
|
|
*/
|
|
public void showNoNetView() {
|
|
mUIHandler.sendEmptyMessage(SHOWNONETVIEW);
|
|
}
|
|
|
|
/**
|
|
* 显示无网络界面
|
|
*/
|
|
private void showNoNetViewHandler() {
|
|
mContentContainer.setVisibility(View.GONE);
|
|
if (mLoadingContainer != null) {
|
|
mLoadingContainer.setVisibility(View.GONE);
|
|
mLoadImgView.clearAnimation();
|
|
}
|
|
if (mNetContainer != null)
|
|
mNetContainer.setVisibility(View.VISIBLE);
|
|
}
|
|
|
|
|
|
/**
|
|
* 显示主界面
|
|
*/
|
|
public void showContentView() {
|
|
mUIHandler.sendEmptyMessage(SHOWCONTENTVIEW);
|
|
}
|
|
|
|
/**
|
|
* 显示主界面
|
|
*/
|
|
private void showContentViewHandler() {
|
|
mContentContainer.setVisibility(View.VISIBLE);
|
|
if (mLoadingContainer != null) {
|
|
mLoadingContainer.setVisibility(View.GONE);
|
|
mLoadImgView.clearAnimation();
|
|
}
|
|
if (mNetContainer != null)
|
|
mNetContainer.setVisibility(View.GONE);
|
|
}
|
|
|
|
public void setAddStatusBarView(boolean addStatusBarView) {
|
|
isAddStatusBarView = addStatusBarView;
|
|
}
|
|
|
|
/**
|
|
* 设置状态栏背景颜色
|
|
*
|
|
* @param statusBarViewBG
|
|
*/
|
|
public void setStatusBarViewBG(int statusBarViewBG) {
|
|
this.mStatusBarViewBG = statusBarViewBG;
|
|
}
|
|
|
|
public void setTitleViewId(int mTitleViewId) {
|
|
this.mTitleViewId = mTitleViewId;
|
|
}
|
|
|
|
@Override
|
|
public void setUserVisibleHint(boolean isVisibleToUser) {
|
|
super.setUserVisibleHint(isVisibleToUser);
|
|
if (!mIsFristVisibleToUser && getUserVisibleHint() && getView() != null) {
|
|
mIsFristVisibleToUser = true;
|
|
isFristVisibleToUser();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 视图可见,只执行一次
|
|
*/
|
|
protected abstract void isFristVisibleToUser();
|
|
|
|
/**
|
|
* 设置主界面内容视图
|
|
*
|
|
* @return
|
|
*/
|
|
protected abstract int setContentLayoutResID();
|
|
|
|
/**
|
|
* 初始化view视图
|
|
*
|
|
* @param savedInstanceState
|
|
*/
|
|
protected abstract void initViews(View mainView, Bundle savedInstanceState);
|
|
|
|
/**
|
|
* 处理UI
|
|
*
|
|
* @param msg
|
|
*/
|
|
protected abstract void handleUIMessage(Message msg);
|
|
|
|
/**
|
|
* 处理子线程worker
|
|
*
|
|
* @param msg
|
|
*/
|
|
protected abstract void handleWorkerMessage(Message msg);
|
|
|
|
|
|
public interface RefreshListener {
|
|
void refresh();
|
|
}
|
|
|
|
public void setRefreshListener(RefreshListener mRefreshListener) {
|
|
this.mRefreshListener = mRefreshListener;
|
|
}
|
|
}
|