• 前言

dialog弹窗是Android中一个常用的控件,Android本身提供dialog又不满足我们的需求

  • dialog的种类
  1. dialog
  2. FragmentDialog
  3. BottomSheetDialog
  4. FragmentBottomSheetDialog

本片文章是用构建模式打造一个快捷dialog的使用

  • 构建思路
  1. 控件初始化构造
  2. 数据初始化构造
  • 控件初始化构造

这一部分是不会变化的,我门采用构建者模式设置

   //dialog的builder类public class DialogBuilder {//布局idprivate int layoutId;//宽高private int wight = ViewGroup.LayoutParams.MATCH_PARENT;private int height = ViewGroup.LayoutParams.WRAP_CONTENT;//动画private int anim;//点击外面是否取消private boolean canceledOnTouchOutside=true;//返回是否可以取消private boolean canceled=true;//主题类型private int themeRes= R.style.BaseDialog;//view的点击时间private View.OnClickListener onClickListener;//取消监听private DialogInterface.OnDismissListener onDismissListener;//onkey监听private DialogInterface.OnKeyListener onKeyListener;public DialogBuilder setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {this.onDismissListener = onDismissListener;return this;}public DialogBuilder setOnKeyListener(DialogInterface.OnKeyListener onKeyListener) {this.onKeyListener = onKeyListener;return this;}public DialogBuilder setContentView(@LayoutRes int layoutId){this.layoutId=layoutId;return this;}public DialogBuilder setWight(int wight) {this.wight = wight;return this;}public DialogBuilder setHeight(int height) {this.height = height;return this;}public DialogBuilder setAnim(int anim) {this.anim = anim;return this;}public DialogBuilder setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {this.canceledOnTouchOutside = canceledOnTouchOutside;return this;}public DialogBuilder setCanceled(boolean canceled) {this.canceled = canceled;return this;}public DialogBuilder setThemeRes(int themeRes) {this.themeRes = themeRes;return this;}public DialogBuilder setOnClickListener(View.OnClickListener onClickListener) {this.onClickListener = onClickListener;return this;}//构建dialogutilspublic DialogUtils buildDialog(Context context){View view = LayoutInflater.from(context).inflate(layoutId!=0?layoutId: R.layout.pure_window_error, null);Dialog dialog = new Dialog(context,themeRes);dialog.setContentView(view,new ViewGroup.LayoutParams(wight,height));dialog.setCanceledOnTouchOutside(canceledOnTouchOutside);dialog.setCancelable(canceled);if (onDismissListener!=null){dialog.setOnDismissListener(onDismissListener);}if (onKeyListener!=null){dialog.setOnKeyListener(onKeyListener);}Window window = dialog.getWindow();if (anim!=0){window.setWindowAnimations(anim);}return new DialogUtils(dialog,window,view,onClickListener);}//构建BaseDialogUtilspublic BaseDialogUtils buildBottom(Context context){View view = LayoutInflater.from(context).inflate(layoutId!=0?layoutId: R.layout.pure_window_error, null);BottomSheetDialog dialog = new BottomSheetDialog(context, themeRes);dialog.setContentView(view,new ViewGroup.LayoutParams(wight,height));dialog.setCanceledOnTouchOutside(canceledOnTouchOutside);dialog.setCancelable(canceled);if (onDismissListener!=null){dialog.setOnDismissListener(onDismissListener);}if (onKeyListener!=null){dialog.setOnKeyListener(onKeyListener);}if (anim!=0){Window window = dialog.getWindow();window.setWindowAnimations(anim);}return new BaseDialogUtils(dialog,view,onClickListener);}
}

dialogutils

   public static DialogBuilder builder(){return new DialogBuilder();}

dialog存在屏幕可以设置,或者宽高设置

public class DialogUtils extends BaseDialogUtils<DialogUtils> {private Window window;public DialogUtils(Dialog dialog, Window window, View view, View.OnClickListener onClickListener) {super(dialog,view, onClickListener);this.window=window;}public DialogUtils setSplace(float scaleX, float scaleY){return setSplace(scaleX,scaleY,Gravity.NO_GRAVITY);}public DialogUtils setSplace(float scaleX, float scaleY, int gravity){return setSplace(scaleX,scaleY,0,0,gravity);}public DialogUtils setSplace(float scaleX, float scaleY, int x, int y, int gravity){WindowManager.LayoutParams lp = window.getAttributes();if (scaleX>0&&scaleX<=1){lp.width=(int)(SizeUtils.getScreenWidth()*scaleX);}if (scaleY>0&&scaleY<=1){lp.height=(int)(SizeUtils.getScreenHeight()*scaleY);}if (x!=0){lp.x=x;}if (y!=0){lp.y=y;}lp.gravity=gravity;window.setAttributes(lp);return this;}public DialogUtils setSplace(int width, int height){return setSplace(width,height,Gravity.NO_GRAVITY);}public DialogUtils setSplace(int width, int height, int gravity){return setSplace(width,height,0,0,gravity);}public DialogUtils setSplace(int width, int height, int x, int y, int gravity){WindowManager.LayoutParams lp = window.getAttributes();lp.width = width;lp.height = height;if (x!=0){lp.x=x;}if (x!=0){lp.y=y;}lp.gravity=gravity;window.setAttributes(lp);return this;}public static DialogBuilder builder(){return new DialogBuilder();}
}

baseDialogUtils

public class BaseDialogUtils<T extends BaseDialogUtils> extends WindowViewUtils<T> {private Dialog dialog;public BaseDialogUtils(Dialog dialog, View view, View.OnClickListener onClickListener) {super(view, onClickListener);this.dialog=dialog;}//显示public void show(){if (dialog!=null&&!dialog.isShowing());{dialog.show();}}//隐藏public void dismiss(){if (dialog!=null&&dialog.isShowing()){dialog.dismiss();}}}

控件初始化打造基本完成

  • 数据初始化打造

我们拿到view,就可以对view里面的控件进行对应的复制,或者设置,为了避免多余findbyid,采用一个view缓存机制

public class WindowViewUtils<T extends WindowViewUtils>{private SparseArray<View> sparseArray=new SparseArray<>();protected View viewParent;protected Context context;protected View.OnClickListener onClickListener;public WindowViewUtils(View view, View.OnClickListener onClickListener){this.viewParent=view;this.onClickListener=onClickListener;}public <V extends View> V fdView(@IdRes int id){View view = sparseArray.get(id);if (view==null){view=viewParent.findViewById(id);sparseArray.put(id,view);}return (V)view;}/*** 设置点击事件* @param* @return*/public T setClick(@IdRes int ...ids){if (onClickListener!=null){for(int id:ids){fdView(id).setOnClickListener(onClickListener);}}return ((T) this);}/*** TextView* @param id* @param content* @param click* @return*/public T setTextView(@IdRes int id,String content,boolean click){View view = fdView(id);if (view instanceof TextView){TextView textView = (TextView) view;textView.setText(TextUtils.isEmpty(content)?"":content);if (click&&onClickListener!=null){textView.setOnClickListener(onClickListener);}}return ((T) this);}public T setTextView(@IdRes int id, @StringRes int content, boolean click){return setTextView(id,context.getResources().getString(content),click);}/*** 设置editview* @param id* @param content* @param hint* @return*/public T setEditView(@IdRes int id,String content,boolean hint){View view = fdView(id);if (view instanceof EditText){EditText editText = (EditText) view;if (hint){editText.setText("");editText.setHint(TextUtils.isEmpty(content)?"":content);}else{editText.setText(TextUtils.isEmpty(content)?"":content);}}return ((T) this);}public T setEditView(@IdRes int id,@StringRes int content,boolean hint){return setEditView(id,context.getResources().getString(content),hint);}/*** recyclerview* @param id* @param adapter* @param layoutManager* @return*/public T setRecyclerView(@IdRes int id, @NonNull RecyclerView.Adapter adapter,@NonNull RecyclerView.LayoutManager layoutManager){View view = fdView(id);if (view instanceof RecyclerView){RecyclerView recyclerView = (RecyclerView) view;recyclerView.setAdapter(adapter);recyclerView.setLayoutManager(layoutManager);}return ((T) this);}/*** button* @param id* @param content* @param click* @return*/public T setButton(@IdRes int id,String content,boolean click){View view = fdView(id);if (view instanceof Button){Button button = (Button) view;button.setText(TextUtils.isEmpty(content)?"":content);if (click&&onClickListener!=null){button.setOnClickListener(onClickListener);}}return ((T) this);}public T setButton(@IdRes int id,@StringRes int content,boolean click){return setButton(id,context.getResources().getString(content),click);}/*** RadioButton* @param id* @param content* @return*/public T setRadioButton(@IdRes int id,String content){View view = fdView(id);if (view instanceof RadioButton){RadioButton radioButton = (RadioButton) view;radioButton.setText(TextUtils.isEmpty(content)?"":content);}return ((T) this);}public T setRadioButton(@IdRes int id,@StringRes int content){return setRadioButton(id,context.getResources().getString(content));}}

  • 其他

整个思想基本完成,由于在activity销毁的时候dialog还存在系统就会崩溃,所以我写了一个销毁方法

public class WindowPureUtils {public static void onDialogDestory(BaseDialogUtils...dialogUtils){for (BaseDialogUtils dialogUtil:dialogUtils) {if (dialogUtil!=null){dialogUtil.dismiss();}}}public static void onPopupDestory(PopupWindowUtils...popupWindowUtils){for (PopupWindowUtils popupWindowUtil:popupWindowUtils) {if (popupWindowUtil!=null){popupWindowUtil.dismiss();}}}}

  • 使用
//dialog的创建
dialogOne= DialogUtils.builder().setContentView(R.layout.dialog_one).setOnClickListener(this).setAnim(WindowAnimStyle.left_anim_window).buildDialog(this).setTextView(R.id.dialog_content,"纯白框架必然是精品",false).setTextView(R.id.dialog_sure,"确定",true).setTextView(R.id.dialog_clear,"取消",true).setSplace(0.8f,0);//dialog取消或者销毁@Overrideprotected void onDestroy() {super.onDestroy();WindowPureUtils.onDialogDestory(dialogOne,dialogTwo);}

  • 效果

https://www.zhihu.com/video/1152220398853734400

  • 代码

项目中window文件中

YwcSillyWhite/purewhilelibrary​github.com

有什么不懂的,或者有好的提议可以添加qq 1075770029,或者加qq群127299409,欢迎大家一起讨论

android dialog 点击遮罩 关闭_如何用构建者模式打造自己dialog相关推荐

  1. android 按钮点击动画效果_如何用纯css打造类materialUI的按钮点击动画并封装成react组件...

    作为一个前端框架的重度使用者,在技术选型上也会非常注意其生态和完整性.笔者先后开发过基于vue,react,angular等框架的项目,碧如vue生态的elementUI, ant-design-vu ...

  2. dialog监听点击空白关闭_为什么App Store打开一片空白?尝试这样解决

    作为苹果唯一官方应用商店,App Store的重要性不言而喻.而很多ios用户都曾经遇到过这种情况,就是当你想要进入App Store下载相关软件时,发现点击进入一片空白.今天阿签就来和大家说说,为什 ...

  3. word修订模式怎么彻底关闭_如何去掉word修订模式

    如何去除word文档中的修订模式 工具/原料:word2007软件. 1.打开word文档,单击"审阅"菜单,单击"修订"命令启用修订功能,如下图:2.对文档进 ...

  4. recyclerview item 点击有背景_如何用RecyclerView实现猫眼电影选择效果

    一.简介 在官方推出RecyclerView 控件之后,越来越多的人都使用它代替之前的ListView.除了最普通的列表显示,RecyclerView还可以其他的很多效果,例如Banner等.在最近的 ...

  5. img 标签 点击跳出图层_如何用PS在一个图层里画出一个会动的太极八卦图|教程...

    如何用PS的加减运算做出一个标准的八卦图(超详细步骤,小白福利),首先要考虑八卦图一共用了几个圆,每个圆与每个圆之间的联系. 首先ctrl+n新建一个画板(宽和高随便设置) 用矢量工具来画八卦图,什么 ...

  6. 构建器模式_我喜欢构建器模式的三个原因

    构建器模式 有三种方法可以用Java编程语言创建新对象: 伸缩构造函数(反)模式 Javabeans模式 建造者模式 与其他两种方法相比,我更喜欢使用构建器模式. 为什么? Joshua Bloch描 ...

  7. 小米服务组件是什么东西_如何用小米智能家庭打造环境控制(温度、湿度、空气质量)...

    当然今天的主角是小米的智能家庭组件. 因为我在用的整套系统是基于Broadlink的,所以为了测试小米,我把其中的一部分功能拿出来让小米智能来完成,恰好又有小米空气净化器,所以就把环境控制部分让小米智 ...

  8. 如何进入训练模式_如何用“训练营+社群”模式,在超10亿用户的微信生态掘金?...

    不记得是哪一年,我的朋友圈里突然出现了一个训练营类的产品,很多人在朋友圈发"xxx166天,221589字[xx阅读]",我就心想,这个不就是打卡吗,怎么这么多人在学,能有效果吗? ...

  9. vue自定义弹窗dialog,vue 点击遮罩层功能区以外的地方关闭遮罩层

    vue自定义弹窗dialog,vue 点击遮罩层功能区以外的地方关闭遮罩层 1.示例展示 2.代码 <template><div class="content"& ...

最新文章

  1. 三星会使用华为的鸿蒙系统,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  2. android酷狗界面,酷狗音乐Android 2.2版系统优化版界面曝光
  3. 国产自主可控的MBSE建模与仿真平台SkyEye
  4. 已开源|码上用它开始Flutter混合开发——FlutterBoost
  5. TextView 不用获取焦点也能实现跑马灯
  6. dtu转发虚拟服务器,DTU转发云服务器
  7. 正态总体统计量的分布
  8. 几个简约Jekyll主题推荐
  9. 如何在一周内快速摸清一个行业?
  10. 开机时自动启动的AutoHotkey脚本 2019年07月08日19时06分
  11. 启动docker-compose时报/usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarnin
  12. 老毛子(华硕)固件ipv6及dmz主机设置
  13. ZynqMP 调试 FSBL 代码
  14. IEEE TRANSACTIONS ON INSTRUMENTATION AND MEASUREMENT(IEEE TIM)投稿过程
  15. 数据预处理:标称型特征的编码和缺失值处理
  16. 无线热点(AP)不稳定之信道的配置优化实践-分析周围信道修改本地使用信道
  17. 礼品 read.php,心愿送礼网教你如何体面的接受礼品
  18. JAVA毕业设计进出货管理系统计算机源码+lw文档+系统+调试部署+数据库
  19. matlab网页视频流,MATLAB - 捕获视频流(MJPEG,rtsp,mpeg)
  20. 评中级职称论文挂名可以快速通过职称评审吗?

热门文章

  1. 给你出道题---最佳组合问题
  2. 概率校准Probability Calibration
  3. 语义分割之评价指标MIoU介绍
  4. IT人员及程序员怎样学好英语(关于如何利用极其有限的时间和条件学好英文)...
  5. Mysql语句改成Oracle语句的区别
  6. 看到的一个很不错的分析LCA和RMQ的文章(转载,先收着)
  7. node(基础)_node中的javascript
  8. 8 传输层----TCP
  9. Socket编程入门
  10. NOIP 2000 进制转换