RyCarPlayer/app/src/main/java/com/zlm/hp/fragment/BaseFragment.java

429 lines
12 KiB
Java
Raw Normal View History

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;
}
}