Android MVVM框架搭建(七)Permission、AlertDialog、拍照和相册选取

public class AlertController {

private AlertDialog mAlertDialog;

private Window mWindow;

private DialogViewHelper mViewHelper;

public AlertController(AlertDialog alertDialog, Window window) {

mAlertDialog = alertDialog;

mWindow = window;

}

public void setDialogViewHelper(DialogViewHelper dialogViewHelper) {

mViewHelper = dialogViewHelper;

}

public void setText(int viewId, CharSequence text) {

mViewHelper.setText(viewId, text);

}

public void setIcon(int viewId, int resId) {

mViewHelper.setIcon(viewId, resId);

}

public T getView(int viewId) {

return mViewHelper.getView(viewId);

}

public void setOnClickListener(int viewId, View.OnClickListener onClickListener) {

mViewHelper.setOnClickListener(viewId, onClickListener);

}

public AlertDialog getDialog() {

return mAlertDialog;

}

public Window getWindow() {

return mWindow;

}

//-------------------------------------------------------------------------------------------------

public static class AlertParams {

public Context mContext;

//对话框主题背景

public int mThemeResId;

public boolean mCancelable;

public DialogInterface.OnCancelListener mOnCancelListener;

public DialogInterface.OnDismissListener mOnDismissListener;

public DialogInterface.OnKeyListener mOnKeyListener;

//文本颜色

public SparseArray mTextColorArray = new SparseArray<>();

//存放文本的更改

public SparseArray mTextArray = new SparseArray<>();

//存放点击事件

public SparseArray<View.OnClickListener> mClickArray = new SparseArray<>();

//存放长按点击事件

public SparseArray<View.OnLongClickListener> mLondClickArray = new SparseArray<>();

//存放对话框图标

public SparseArray mIconArray = new SparseArray<>();

//存放对话框图片

public SparseArray mBitmapArray = new SparseArray<>();

//对话框布局资源id

public int mLayoutResId;

//对话框的view

public View mView;

//对话框宽度

public int mWidth;

//对话框高度

public int mHeight;

//对话框垂直外边距

public int mHeightMargin;

//对话框横向外边距

public int mWidthMargin;

//动画

public int mAnimation;

//对话框显示位置

public int mGravity = Gravity.CENTER;

public AlertParams(Context context, int themeResId) {

mContext = context;

mThemeResId = themeResId;

}

public void apply(AlertController alert) {

//设置对话框布局

DialogViewHelper dialogViewHelper = null;

if (mLayoutResId != 0) {

dialogViewHelper = new DialogViewHelper(mContext, mLayoutResId);

}

if (mView != null) {

dialogViewHelper = new DialogViewHelper();

dialogViewHelper.setContentView(mView);

}

if (dialogViewHelper == null) {

throw new IllegalArgumentException(“please set layout”);

}

//将对话框布局设置到对话框

alert.getDialog().setContentView(dialogViewHelper.getContentView());

//设置DialogViewHelper辅助类

alert.setDialogViewHelper(dialogViewHelper);

//设置文本

for (int i = 0; i < mTextArray.size(); i++) {

alert.setText(mTextArray.keyAt(i), mTextArray.valueAt(i));

}

//设置图标

for (int i = 0; i < mIconArray.size(); i++) {

alert.setIcon(mIconArray.keyAt(i), mIconArray.valueAt(i));

}

//设置点击

for (int i = 0; i < mClickArray.size(); i++) {

alert.setOnClickListener(mClickArray.keyAt(i), mClickArray.valueAt(i));

}

//配置自定义效果,底部弹出,宽高,动画,全屏

Window window = alert.getWindow();

window.setGravity(mGravity);//显示位置

if (mAnimation != 0) {

window.setWindowAnimations(mAnimation);//设置动画

}

//设置宽高

WindowManager.LayoutParams params = window.getAttributes();

params.width = mWidth;

params.height = mHeight;

params.verticalMargin = mHeightMargin;

params.horizontalMargin = mWidthMargin;

window.setAttributes(params);

}

}

}

下面自定义Dialog

③ AlertDialog

在dialog包下新建一个AlertDialog,里面的代码如下:

public class AlertDialog extends Dialog {

private AlertController mAlert;

public AlertDialog(@NonNull Context context, @StyleRes int themeResId) {

super(context, themeResId);

mAlert = new AlertController(this, getWindow());

}

public void setText(int viewId, CharSequence text) {

mAlert.setText(viewId, text);

}

public T getView(int viewId) {

return mAlert.getView(viewId);

}

public void setOnClickListener(int viewId, View.OnClickListener onClickListener) {

mAlert.setOnClickListener(viewId, onClickListener);

}

//----------------------------------------------------------------------------------------------

public static class Builder {

private final AlertController.AlertParams P;

public Builder(Context context) {

this(context, R.style.dialog);

}

public Builder(Context context, int themeResId) {

P = new AlertController.AlertParams(context, themeResId);

}

/**

  • 设置对话框布局

  • @param view

  • @return

*/

public Builder setContentView(View view) {

P.mView = view;

P.mLayoutResId = 0;

return this;

}

/**

  • @param layoutId

  • @return

*/

public Builder setContentView(int layoutId) {

P.mView = null;

P.mLayoutResId = layoutId;

return this;

}

/**

  • 设置文本

  • @param viewId

  • @param text

  • @return

*/

public Builder setText(int viewId, CharSequence text) {

P.mTextArray.put(viewId, text);

return this;

}

/**

  • 设置文本颜色

  • @param viewId

  • @param color

  • @return

*/

public Builder setTextColor(int viewId, int color) {

P.mTextColorArray.put(viewId, color);

return this;

}

/**

  • 设置图标

  • @param iconId

  • @return

*/

public Builder setIcon(int iconId, int resId) {

P.mIconArray.put(iconId, resId);

return this;

}

/**

  • 设置图片

  • @param viewId

  • @return

*/

public Builder setBitmap(int viewId, Bitmap bitmap) {

P.mBitmapArray.put(viewId, bitmap);

return this;

}

/**

  • 设置对话框宽度占满屏幕

  • @return

*/

public Builder fullWidth() {

P.mWidth = ViewGroup.LayoutParams.MATCH_PARENT;

return this;

}

/**

  • 对话框底部弹出

  • @param isAnimation

  • @return

*/

public Builder fromBottom(boolean isAnimation) {

if (isAnimation) {

P.mAnimation = R.style.dialog_from_bottom_anim;

}

P.mGravity = Gravity.BOTTOM;

return this;

}

/**

  • 对话框右部弹出

  • @param isAnimation

  • @return

*/

public Builder fromRight(boolean isAnimation) {

if (isAnimation) {

P.mAnimation = R.style.dialog_scale_anim;

}

P.mGravity = Gravity.RIGHT;

return this;

}

/**

  • 设置对话框宽高

  • @param width

  • @param heigth

  • @return

*/

public Builder setWidthAndHeight(int width, int heigth) {

P.mWidth = width;

P.mHeight = heigth;

return this;

}

/**

  • 设置对话框宽高

  • @param width

  • @param heigth

  • @return

*/

public Builder setWidthAndHeightMargin(int width, int heigth, int heightMargin, int widthMargin) {

P.mWidth = width;

P.mHeight = heigth;

P.mHeightMargin = heightMargin;

P.mWidthMargin = widthMargin;

return this;

}

/**

  • 添加默认动画

  • @return

*/

public Builder addDefaultAnimation() {

P.mAnimation = R.style.dialog_scale_anim;

return this;

}

/**

  • 设置动画

  • @param styleAnimation

  • @return

*/

public Builder setAnimation(int styleAnimation) {

P.mAnimation = styleAnimation;

return this;

}

/**

  • 设置点击事件

  • @param viewId

  • @param onClickListener

  • @return

*/

public Builder setOnClickListener(int viewId, View.OnClickListener onClickListener) {

P.mClickArray.put(viewId, onClickListener);

return this;

}

public Builder setOnLongClickListener(int viewId, View.OnLongClickListener onLongClickListener) {

P.mLondClickArray.put(viewId, onLongClickListener);

return this;

}

/**

  • Sets whether the dialog is cancelable or not. Default is true.

  • @return This Builder object to allow for chaining of calls to set methods

*/

public Builder setCancelable(boolean cancelable) {

P.mCancelable = cancelable;

return this;

}

public Builder setOnCancelListener(OnCancelListener onCancelListener) {

P.mOnCancelListener = onCancelListener;

return this;

}

public Builder setOnDismissListener(OnDismissListener onDismissListener) {

P.mOnDismissListener = onDismissListener;

return this;

}

public Builder setOnKeyListener(OnKeyListener onKeyListener) {

P.mOnKeyListener = onKeyListener;

return this;

}

public AlertDialog create() {

// Context has already been wrapped with the appropriate theme.

final AlertDialog dialog = new AlertDialog(P.mContext, P.mThemeResId);

P.apply(dialog.mAlert);

dialog.setCancelable(P.mCancelable);

if (P.mCancelable) {

dialog.setCanceledOnTouchOutside(true);

}

dialog.setOnCancelListener(P.mOnCancelListener);

dialog.setOnDismissListener(P.mOnDismissListener);

if (P.mOnKeyListener != null) {

dialog.setOnKeyListener(P.mOnKeyListener);

}

return dialog;

}

public AlertDialog show() {

final AlertDialog dialog = create();

dialog.show();

return dialog;

}

}

}

④ 样式

在设置弹窗的样式和弹窗出现的方式,在themes.xml下新增如下代码:

这里还用到动画样式文件,在res文件夹下新建一个anim文件夹,里面定义了7个xml文件,如下所示:

新建dialog_from_bottom_anim_in.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>

<translate

android:duration=“400”

android:fromXDelta=“0”

android:fromYDelta=“1000”

android:toXDelta=“0”

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值