第一次提交

This commit is contained in:
xuhuixiang
2023-03-13 10:07:44 +08:00
parent 0378d81708
commit e5ef7288f4
267 changed files with 17967 additions and 86 deletions

View File

@@ -0,0 +1,70 @@
package com.azhon.basic.base;
import android.app.Activity;
import android.os.Build;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.Observer;
import com.azhon.basic.bean.DialogBean;
import com.azhon.basic.lifecycle.BaseViewModel;
/**
* 项目名: TODO-MVVM
* 包名 com.azhon.basic.base
* 文件名: BaseActivity
* 创建时间: 2019-03-27 on 10:46
* 描述: TODO ViewModel、ViewDataBinding都需要的基类
*
* @author xuhuixiang
*/
public abstract class BaseActivity<VM extends BaseViewModel, DB extends ViewDataBinding>
extends BaseNoModelActivity<DB> {
protected VM viewModel;
@Override
protected DB initDataBinding(int layoutId) {
DB db = super.initDataBinding(layoutId);
/**
* 将这两个初始化函数插在{@link BaseActivity#initDataBinding}
*/
viewModel = initViewModel();
initObserve();
return db;
}
/**
* 初始化ViewModel
*/
protected abstract VM initViewModel();
/**
* 监听当前ViewModel中 showDialog和error的值
*/
private void initObserve() {
if (viewModel == null) return;
viewModel.getShowDialog(this, bean -> {
if (bean.isShow()) {
showDialog(bean.getMsg());
} else {
dismissDialog();
}
});
viewModel.getError(this, obj -> showError(obj));
}
/**
* ViewModel层发生了错误
*/
protected abstract void showError(Object obj);
}

View File

@@ -0,0 +1,105 @@
package com.azhon.basic.base;
import android.annotation.SuppressLint;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.Observer;
import com.azhon.basic.bean.DialogBean;
import com.azhon.basic.lifecycle.BaseViewModel;
/**
* 项目名: TODO-MVVM
* 包名 com.azhon.basic.base
* 文件名: BaseFragment
* 创建时间: 2019-03-28 on 17:35
* 描述: TODO ViewModel、ViewDataBinding都需要的基类
*
* @author xuhuixiang
*/
public abstract class BaseFragment<VM extends BaseViewModel, DB extends ViewDataBinding>
extends BaseNoModelFragment<DB> {
protected VM viewModel;
private static Toast toast;
@Override
protected DB initDataBinding(LayoutInflater inflater, int layoutId, ViewGroup container) {
DB db = super.initDataBinding(inflater, layoutId, container);
/**
* 将这两个初始化函数插在{@link BaseFragment#initDataBinding}
*/
viewModel = initViewModel();
initObserve();
return db;
}
/**
* 初始化ViewModel
*/
protected abstract VM initViewModel();
/**
* 监听当前ViewModel中 showDialog和error的值
*/
private void initObserve() {
if (viewModel == null) return;
viewModel.getShowDialog(this, new Observer<DialogBean>() {
@Override
public void onChanged(DialogBean bean) {
if (bean.isShow()) {
showDialog(bean.getMsg());
} else {
dismissDialog();
}
}
});
viewModel.getError(this, new Observer<Object>() {
@Override
public void onChanged(Object obj) {
showError(obj);
}
});
}
/**
* ViewModel层发生了错误
*/
protected abstract void showError(Object obj);
// /**
// * 显示提示 toast
// *
// * @param msg 提示信息
// */
// @SuppressLint("ShowToast")
// public void showToast(String msg) {
// try {
// if (null == toast) {
// toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
// } else {
// toast.setText(msg);
// }
// getActivity().runOnUiThread(new Runnable() {
// @Override
// public void run() {
// toast.show();
// }
// });
// } catch (Exception e) {
// e.printStackTrace();
// //解决在子线程中调用Toast的异常情况处理
// Looper.prepare();
// Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
// Looper.loop();
// }
// }
}

View File

@@ -0,0 +1,36 @@
package com.azhon.basic.base;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.LifecycleObserver;
import com.azhon.basic.lifecycle.BaseViewModel;
/**
* 项目名: TODO-MVVM
* 包名 com.azhon.basic.base
* 文件名: BaseLazyFragment
* 创建时间: 2019-03-28 on 18:01
* 描述: TODO 懒加载Fragment基类适用于一个页面多个Tab页面
*
* @author xuhuixiang
*/
public abstract class BaseLazyFragment<VM extends BaseViewModel, DB extends ViewDataBinding>
extends BaseFragment<VM, DB> implements LifecycleObserver {
public boolean visibleToUser;
@Override
public void onResume() {
super.onResume();
if (!visibleToUser) {
visibleToUser = true;
lazyLoad();
}
}
/**
* 懒加载只有在Fragment第一次创建且第一次对用户可见
*/
protected abstract void lazyLoad();
}

View File

@@ -0,0 +1,328 @@
package com.azhon.basic.base;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;
import androidx.annotation.LayoutRes;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import com.azhon.basic.utils.ActivityUtil;
import com.azhon.basic.view.LoadingDialog;
/**
* 项目名: TODO-MVVM
* 包名 com.azhon.basic.base
* 文件名: BaseNoModelActivity
* 创建时间: 2019-03-28 on 10:28
* 描述: TODO 不需要ViewModel的页面基类
*
* @author xuhuixiang
*/
public abstract class BaseNoModelActivity<DB extends ViewDataBinding> extends AppCompatActivity {
protected DB dataBinding;
protected Context context;
private LoadingDialog loadingDialog;
public Bundle bundle;
//获取TAG的activity名称
protected final String TAG = this.getClass().getSimpleName();
//是否显示标题栏
private boolean isShowTitle = false;
//是否显示状态栏
private boolean isShowStatusBar = true;
//是否允许旋转屏幕
private boolean isAllowScreenRoate = true;
//封装Toast对象
private static Toast toast;
@SuppressLint("SourceLockedOrientationActivity")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
View decor = window.getDecorView();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
if(this.getApplicationContext().getResources().getConfiguration().uiMode == 0x21){
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}else {
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
// Paint paint = new Paint();
// ColorMatrix matrix = new ColorMatrix();
// matrix.setSaturation(0);
// paint.setColorFilter(new ColorMatrixColorFilter(matrix));
// getWindow().getDecorView().setLayerType(View.LAYER_TYPE_HARDWARE, paint);
super.onCreate(savedInstanceState);
context = this;
this.bundle=savedInstanceState;
ActivityUtil.getInstance().addActivity(this);
int layoutId = initLayout();
setContentView(layoutId);
// setStatusBarColor(this,Color.TRANSPARENT);
dataBinding = initDataBinding(layoutId);
initView();
initData();
}
/**
* 修改状态栏颜色支持4.4以上版本
* @param activity
* @param colorId
*/
public static void setStatusBarColor(Activity activity, int colorId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(colorId);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
/**
* 修改状态栏颜色支持4.4以上版本
* @param activity
* @param colorId
*/
public static void setStatusBarColorW(Activity activity, int colorId,boolean statusBarTextIsWhiteColor) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(activity.getResources().getColor(colorId));
if(statusBarTextIsWhiteColor) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}else{
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
}
public void hideActionBar(){
//this.getSupportActionBar().hide();
}
/**
* 初始化要加载的布局资源ID
* 此函数优先执行于onCreate()可以做window操作
*/
protected abstract int initLayout();
/**
* 初始化DataBinding
*/
protected DB initDataBinding(@LayoutRes int layoutId) {
return DataBindingUtil.setContentView(this, layoutId);
}
/**
* 初始化视图
*/
protected abstract void initView();
/**
* 初始化数据
*/
protected abstract void initData();
/**
* 显示用户等待框
*
* @param msg 提示信息
*/
protected void showDialog(String msg) {
if (loadingDialog != null && loadingDialog.isShowing()) {
loadingDialog.setLoadingMsg(msg);
} else {
loadingDialog = new LoadingDialog(context);
loadingDialog.setLoadingMsg(msg);
loadingDialog.show();
}
}
/**
* 隐藏等待框
*/
protected void dismissDialog() {
if (loadingDialog != null && loadingDialog.isShowing()) {
loadingDialog.dismiss();
loadingDialog = null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (dataBinding != null) {
dataBinding.unbind();
}
ActivityUtil.getInstance().removeActivity(this);
}
/**
* 设置是否显示标题栏
*
* @param showTitle true or false
*/
public void setShowTitle(boolean showTitle) {
isShowTitle = showTitle;
}
/**
* 设置是否显示状态栏
*
* @param showStatusBar true or false
*/
public void setShowStatusBar(boolean showStatusBar) {
isShowStatusBar = showStatusBar;
}
/**
* 是否允许屏幕旋转
*
* @param allowScreenRoate true or false
*/
public void setAllowScreenRoate(boolean allowScreenRoate) {
isAllowScreenRoate = allowScreenRoate;
}
/**
* 保证同一按钮在1秒内只会响应一次点击事件
*/
public abstract class OnSingleClickListener implements View.OnClickListener {
//两次点击按钮之间的间隔目前为1000ms
private static final int MIN_CLICK_DELAY_TIME = 1000;
private long lastClickTime;
public abstract void onSingleClick(View view);
@Override
public void onClick(View view) {
long curClickTime = System.currentTimeMillis();
if ((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) {
lastClickTime = curClickTime;
onSingleClick(view);
}
}
}
/**
* 同一按钮在短时间内可重复响应点击事件
*/
public abstract class OnMultiClickListener implements View.OnClickListener {
public abstract void onMultiClick(View view);
@Override
public void onClick(View v) {
onMultiClick(v);
}
}
// /**
// * 显示提示 toast
// *
// * @param msg 提示信息
// */
// @SuppressLint("ShowToast")
// public void showToast(String msg) {
// try {
// if (null == toast) {
// toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
// } else {
// toast.setText(msg);
// }
// runOnUiThread(new Runnable() {
// @Override
// public void run() {
// toast.show();
// }
// });
// } catch (Exception e) {
// e.printStackTrace();
// //解决在子线程中调用Toast的异常情况处理
// Looper.prepare();
// Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
// Looper.loop();
// }
// }
/**
* 隐藏软键盘
*/
public void hideSoftInput() {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if (getCurrentFocus() != null && null != imm) {
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
/**
* 显示软键盘
*/
public void showSoftInput() {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if (getCurrentFocus() != null && null != imm) {
imm.showSoftInputFromInputMethod(getCurrentFocus().getWindowToken(), 0);
}
}
protected void showToast(String message){
// try {
// SnackbarUtils.Short(dataBinding.getRoot(),message).show();
//
// }catch (Exception e){e.printStackTrace();}
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}
protected void showToast(String message,int color){
try {
// SnackbarUtils.Short(dataBinding.getRoot(),message,color).show();
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}catch (Exception e){e.printStackTrace();}
}
protected void showToast(View view,String message){
try {
// SnackbarUtils.Short(view,message).show();
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}catch (Exception e){e.printStackTrace();}
}
}

View File

@@ -0,0 +1,180 @@
package com.azhon.basic.base;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import com.azhon.basic.view.LoadingDialog;
/**
* 项目名: TODO-MVVM
* 包名 com.azhon.basic.base
* 文件名: BaseNoModelFragment
* 创建时间: 2019-03-28 on 17:06
* 描述: TODO 不需要ViewModel的页面基类
*
* @author xuhuixiang
*/
public abstract class BaseNoModelFragment<DB extends ViewDataBinding> extends Fragment {
protected DB dataBinding;
protected Context context;
protected FragmentActivity activity;
private LoadingDialog loadingDialog;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
dataBinding = initDataBinding(inflater, setLayoutResourceID(), container);
return dataBinding.getRoot();
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
activity = getActivity();
setUpView();
setUpData();
}
/**
* 初始化要加载的布局资源ID
*/
protected abstract int setLayoutResourceID();
/**
* 初始化DataBinding
*/
protected DB initDataBinding(LayoutInflater inflater, @LayoutRes int layoutId, ViewGroup container) {
return DataBindingUtil.inflate(inflater, layoutId, container, false);
}
/**
* 初始化视图
*/
protected abstract void setUpView();
/**
* 初始化数据
*/
protected abstract void setUpData();
/**
* 显示用户等待框
*
* @param msg 提示信息
*/
protected void showDialog(String msg) {
if (loadingDialog != null && loadingDialog.isShowing()) {
loadingDialog.setLoadingMsg(msg);
} else {
loadingDialog = new LoadingDialog(context);
loadingDialog.setLoadingMsg(msg);
loadingDialog.show();
}
}
protected void showToast(String message){
try {
// SnackbarUtils.Short(dataBinding.getRoot(),message).show();
Toast.makeText(dataBinding.getRoot().getContext(),message,Toast.LENGTH_SHORT).show();
}catch (Exception e){e.printStackTrace();}
}
protected void showToast(View view,String message){
try {
// SnackbarUtils.Short(view,message).show();
Toast.makeText(dataBinding.getRoot().getContext(),message,Toast.LENGTH_SHORT).show();
}catch (Exception e){e.printStackTrace();}
}
protected void showToast(View view,String message,int color){
try {
// SnackbarUtils.Short(view,message,color).show();
Toast.makeText(dataBinding.getRoot().getContext(),message,Toast.LENGTH_SHORT).show();
}catch (Exception e){e.printStackTrace();}
}
protected void showToast(String message,int color){
try {
// SnackbarUtils.Short(dataBinding.getRoot(),message,color).show();
Toast.makeText(dataBinding.getRoot().getContext(),message,Toast.LENGTH_SHORT).show();
}catch (Exception e){e.printStackTrace();}
}
/**
* 隐藏等待框
*/
protected void dismissDialog() {
if (loadingDialog != null && loadingDialog.isShowing()) {
loadingDialog.dismiss();
loadingDialog = null;
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (dataBinding != null) {
dataBinding.unbind();
}
}
public View getContentView() {
return dataBinding.getRoot();
}
public Context getMContext() {
return context;
}
/**
* 隐藏软键盘
*/
public void hideSoftInput() {
View v = getActivity().getCurrentFocus();
if (v != null && v.getWindowToken() != null) {
InputMethodManager manager = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
boolean isOpen = manager.isActive();
if (isOpen) {
manager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
}