通用对话弹窗CommonDialog

Version 1.0

Created by chenchangjun on 18/1/12.

  • 抽离普通基类BaseNormalDialog
  • 优化扩展方式3.1 基本扩展
  • 添加必要注释
image.png



项目中,迭代了快8年了,对话框,种类繁多, 难以维护, 有的继承popwindow, 有的继承dialog, 有的继承dialogFragment....而且写法 各不相同.

所以,急需一次版本迭代, 来 优化 系统所有的弹窗. 本着有轮子就不会去 造轮子的原则~ 但是,逛了一圈,开源的 对话弹窗,都不能满足项目需求,

这就是要 造这个了轮子的初衷.

项目目前,有点粗糙,没有做精简优化,如果想引用,可以直接download然后,作为lib应用.

后期,我会随着项目迭代,进行优化.

项目地址

通用对话弹窗CommonDialog项目地址...

效果图

common_dialog.gif

调用

//通用弹框 生产类
public class DialogCreator {/*** 无标题,单btn弹窗** @param mActivity* @param msg* @param strLeft* @param leftListener*/public static BaseDialog showConfirmDialog(Context mActivity, String msg, String strLeft, OnLeftListener leftListener) {CommonNormalDialog confrimDialog = new CommonNormalDialog(mActivity);confrimDialog.setDialogType(DialogConfig.TYPE_HAS_NO_HEADER).setContent(msg).setContentGravity(DialogConfig.TYPE_GRIVITY_CENTER).setConfirmBtn(strLeft, leftListener).start();return confrimDialog;}/*** 无标题,单btn弹窗** @param mActivity* @param msg* @param strLeft* @param leftListener*/public static BaseDialog showTitleConfirmDialog(Context mActivity, String title, String msg, String strLeft, OnLeftListener leftListener) {CommonNormalDialog confrimDialog = new CommonNormalDialog(mActivity);confrimDialog.setDialogType(DialogConfig.TYPE_HAS_HEADER).setTitle(title).setContent(msg).setContentGravity(DialogConfig.TYPE_GRIVITY_CENTER).setConfirmBtn(strLeft, leftListener).start();return confrimDialog;}
....
}

思路

1.定义顶级抽象类 BaseDialog,

装饰AlertDialog, 统一dialog样式, 并且用 模板方法模式 进行抽象约束 子类型为.
为了达到 易扩展,代码复用的角度, 将整体dialog,根据 功能区域 布局和加载分为3部分----

  • 头部header: 扩展头部区域,像图片logo头部,带背景,大标题.
  • 中间content: 主内容显示区域,比如输入框,内容详情等等.
  • 底部footer:底部扩展区,主要用来放置 确认按钮等等.
/*** 子类必须实现该方法用于显示在界面上的Dialog的Title部分** @return title部分的显示的View,返回的titleView为null的话,Dialog将不显示title部分*/protected abstract View initHeader();/*** 子类必须实现该方法用于显示在界面上的正文部分控件* @return content部分显示的内容,如果返回null,将会抛出异常*/protected abstract View initContent();/*** 子类实现该方法用于显示底部的view** @return bottom部分显示的view,如果返回null,bottom部分将不显示*/protected abstract View initBottom();/*** 模板方法*/protected abstract void loadHeader();protected abstract void loadContent();protected abstract void loadBottom();public   void start(){loadHeader();loadContent();loadBottom();};

2. 新建子类,CommonNormalDialog CommonImgHeaderDialog CommonLogoHeaderDialog等

子类 分别对模板方法进行实现, 以CommonNormalDialog为例

/*** 普通样式无头部* @return*/@Overrideprotected View initHeader() {return null;}/*** 创建内容布局* @return 内容布局*/@Overrideprotected View initContent() {View content = View.inflate(context, R.layout.common_dialog_content, null);tv_title = (TextView) content.findViewById(R.id.tv_title);tv_content = (TextView) content.findViewById(R.id.tv_content);etv_content = (EditText) content.findViewById(R.id.etv_content);v_vertical_line = content.findViewById(R.id.v_vertical_line);tv_left = (TextView) content.findViewById(R.id.tv_left);tv_right = (TextView) content.findViewById(R.id.tv_right);iv_cancel = (ImageView) content.findViewById(R.id.iv_content_cancel);iv_cancel.setOnClickListener(this);return content;}/*** 创建 底部 按钮布局* @return*/@Overrideprotected View initBottom() {View footer = View.inflate(context, R.layout.common_dialog_footer_btn, null);v_vertical_line = footer.findViewById(R.id.v_vertical_line);tv_left = (TextView) footer.findViewById(R.id.tv_left);tv_right = (TextView) footer.findViewById(R.id.tv_right);return footer;

3.扩展

3.1 普通扩展

如果想要 用如下的 弹窗样式. 那么只需要简单几步就可以实现.

image.png

3.1.1 学习并继承 NormalBaseDialog,并实现其中的三个抽象方法 即可.
/*************************构造子类的内容布局***********************//*** 构造 实现类 内容布局* @return*/public abstract View createContentView();/*** 处理 实现类的 view数据* @param parents view 的ViewGroup容器* @param v view本身*/public abstract void handleContentView(ViewGroup parents, View v);/*** 子类view 监听器* @param v  事件分发 view*/public abstract void onContentClick(View v);
3.1.2 举例说明 在app module中, 有MyDialogDialog ,清爽的代码~ .
/*** 自定义样式* Created by chenchangjun on 17/10/11.*/public class MyDialogDialog extends NormalBaseDialog implements View.OnClickListener {private ImageView card_pic;private TextView card_price;private TextView card_title;/*** 构造 实现类 内容布局** @return*/@Overridepublic View createContentView() {View myView = View.inflate(context, R.layout.dialog_content_focus_dialog_v1, null);card_pic= (ImageView) myView.findViewById(R.id.card_pic);card_price= (TextView) myView.findViewById(R.id.card_price);card_title= (TextView) myView.findViewById(R.id.card_title);card_pic.setOnClickListener(this);return myView;}/*** 处理 实现类的 view数据** @param parents view 的ViewGroup容器* @param v       view本身*/@Overridepublic void handleContentView(ViewGroup parents, View v) {card_pic.setImageResource(R.mipmap.ic_launcher_round);}/*** 子类view 监听器** @param v 事件分发 view*/@Overridepublic void onContentClick(View v) {int i = v.getId();if (i == R.id.card_pic) {Toast.makeText(context,"hello MyDialog!!!!",Toast.LENGTH_SHORT).show();}}public MyDialogDialog setMyView(String st) {card_title.setText(st);return this;}public MyDialogDialog(Context context) {super(context);}}

3.2 其他扩展

如果想要扩展, 根据需求相互扩展即可.

比如 CommonImgHeaderDialog 可以选择继承CommonNormalDialog.共用CommonNormalDialog的 内容布局和 底部布局. 所以,只需要加载header布局即可.

/*** 通用 带头部背景 样式* Created by chenchangjun on 17/10/11.*/public class CommonImgHeaderDialog extends CommonNormalDialog implements View.OnClickListener {private String url_header;private ImageView iv_header_cancel;private SimpleDraweeView iv_header;@Overrideprotected void loadHeader() {if (type== DialogConfig.TYPE_HAS_HEADER){iv_header.setVisibility(View.VISIBLE);iv_header_cancel.setVisibility(View.VISIBLE);if (TextUtils.isEmpty(url_header)) {iv_header.setVisibility(View.GONE);} else {//iv_header.setImageURI(url_header);iv_header.setBackgroundResource(R.drawable.common_dialog_header_bg);Uri uri = Uri.parse(url_header);iv_header.setImageURI(uri);}}}public CommonImgHeaderDialog setHeaderUrl(String str) {url_header = str;return this;}public CommonImgHeaderDialog(Context context) {super(context);}@Overrideprotected View initHeader() {View header=null;if (type==DialogConfig.TYPE_HAS_NO_HEADER){return null;}header = View.inflate(context, R.layout.common_dialog_pic_header, null);iv_header_cancel = (ImageView) header.findViewById(R.id.iv_header_cancel);iv_header = (SimpleDraweeView) header.findViewById(R.id.iv_header);iv_header_cancel.setOnClickListener(this);return header;}}

4. 后期优化

1.优化为一个组件库 发布到 JCenter来使用

2.兼容更多的样式处理

3.精简lib中依赖的处理第三方库......

通用对话弹窗CommonDialog相关推荐

  1. WinForm中实现通用的弹窗提示框

    一.实现效果 二.核心脚本 /*** * Title:"数据采集" 项目 * 主题:弹窗 * Description: * 功能: * 1.弹窗提示 * 2.弹窗类型 * Date ...

  2. Android(三十二):AlertDialog 对话弹窗

    展示 源码 普通弹窗 var btn01 = FindViewById<Button>(Resource.Id.btn_01); var btn02 = FindViewById<B ...

  3. B端设计指南 —— 弹窗 究竟应该如何设计

    这篇文章是我自己在工作中受到各种摧残.无数次开会讨论总结而来,如果你现在深处B端行业,强烈建议大家一定要看完. 收到很多同学关于弹窗的疑问,因为在B端的设计过程中,会接触到很多信息展示方面的疑惑,他们 ...

  4. 二级VB培训笔记07:通用对话框

    二级VB培训笔记07:通用对话框 通用对话框(CommonDialog)控件提供了一组标准对话框界面,包括打开文件.保存文件.选择颜色.选择字体.设置打印机和帮助等六个对话框.这些对话框只能返回用户输 ...

  5. 对话即平台,一场对长尾理论的逆向革命

    在互联网的时代,搜索引擎是一个基础的服务,长尾理论的出现是一个里程碑性的事件,体现了信息革命带来的最翻天覆地的变化, 曾经被我们忽视的一方天地,汇集在一起其影响却剧烈地震撼着我们的生活和经济,长尾蕴含 ...

  6. 对话系统 | (3) 阿里云小蜜对话机器人背后的核心算法

    原文地址 分享嘉宾:唐呈光 阿里巴巴 算法专家 编辑整理:刘汝洲 内容来源:阿里小蜜 & DataFun AI Talk 出品社区:DataFun 阿里小蜜智能对话开发平台是智能服务事业部推出 ...

  7. 鸿蒙三方组件资源汇总

    三方组件资源汇总 本文收集了一些已经开源的三方组件资源,欢迎应用开发者参考和使用,同时也欢迎开发者贡献自己的开源组件库,可以提PR加入到列表当中 目录 工具 三方组件 工具类 图片加载 数据封装传递 ...

  8. 深度解析B端设计规范如何落地?

    哈喽,今天小摹想要和大家分享的则是关于设计规范的内容. 那么具体该怎样将设计规范做到落地呢?来看看小摹推荐的深扒好文吧! 在B端设计中,设计规范怎么建立才能落实下去之前一直困扰着包括我在内的广大设计师 ...

  9. Android基础知识点学习总结

    Android基础知识点学习总结 安卓基础知识个人学习笔记分享~ 一.Android系统架构 Linux内核层→系统运行层→应用框架层→应用层 1.Linux内核层:Android系统是基于Linux ...

最新文章

  1. Java项目:基于遗传算法学校排课系统(java+Springboot+Maven+mybatis+Vue+Mysql)
  2. 《C++代码设计与重用》——1.2 重用的神话
  3. Kafka 为什么那么快的 6 个原因!
  4. python requests java_java实现类似python requests的session功能
  5. 网上找到的一段关于SAP支持服务的QA (转)
  6. 搭建 Hadoop2.7.2 + Spark1.6环境
  7. Java通过cal.get(Calendar.MONTH)比真实月份少一个月
  8. 一,数据库基础,MySQL安装,配置文件,语法
  9. 2008不可错过的好莱坞电影
  10. docker镜像启动后端口号是多少_初识Docker
  11. ftp文件夹错误 windows无法访问此文件夹_Adobe 安装错误代码对照表及解决方案
  12. 解析ES6箭头函数中的this
  13. 图书馆占座系统(六)
  14. java 行政区划数据库_Java学习-056-Jsoup爬虫获取中国所有的三级行政区划数据(一)...
  15. Arduino + RFID 读取 IC 卡 Arduino uno中获得RFID的UID 并通过串口转发RFID卡号
  16. BSCI认证培训,BSCI验厂费用最终需要和审核机构来确认
  17. andriod ffmpeg
  18. ROS中的roslaunch命令和launch文件(ROS入门学习笔记四)
  19. php 银行支付通道_PHP银联在线支付接口的开发实例
  20. python出租车数据_Python处理JSON格式数据(出租车轨迹数据)

热门文章

  1. [好好笑] 万峰语录3月26日
  2. 150家老字号现身故宫!文具、美食……还有啥?
  3. 2023级上国会-美国亚利桑那州立大学合作的EMBA项目招生中
  4. 利用 Vue 实现评论板块:发表情,@某人消息推送
  5. k3s/k3OS-轻量级Kubernetes及操作系统
  6. egret引入外部字体
  7. 我把废旧 Android 手机改造成了 Linux 服务器,Android开发学习视频
  8. 基于STM32的蓝牙密码锁
  9. 昆泰CH7511B方案设计|CH7511B设计EDP转LVDS资料|pin to pin 替代CH7511B电路设计
  10. oracle dba segments,oracle - Oracle存储过程显示“ dba_segments”错误:表不存在 - 堆栈内存溢出...