代码地址如下:
http://www.demodashi.com/demo/12592.html

通用对话弹窗CommonDialog

Version 1.0

Created by chenchangjun on 18/1/12.

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



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

效果图

调用

//通用弹框 生产类
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
*/
@Override
protected View initHeader() {
return null;
} /**
* 创建内容布局
* @return 内容布局
*/
@Override
protected 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
*/
@Override
protected 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 普通扩展

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

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
*/
@Override
public 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本身
*/
@Override
public void handleContentView(ViewGroup parents, View v) {
card_pic.setImageResource(R.mipmap.ic_launcher_round); } /**
* 子类view 监听器
*
* @param v 事件分发 view
*/
@Override
public 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; @Override
protected 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);
} @Override
protected 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

代码地址如下:
http://www.demodashi.com/demo/12592.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

通用对话弹窗CommonDialog的更多相关文章

  1. 项目期复习:JS操作符,弹窗与调试,凝视,数据类型转换

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/huangyibin628/article/details/26364901 1.JS操作符 ① 除法 ...

  2. tkinter 基础教程

    目录 介绍 模块 导入方式 API 使用 主窗口 运行窗口 组件列表介绍 Label 标签 Button 按钮 Options 属性选项 文本框 Entry 单行文本框 Text 多行文本框 文本框属 ...

  3. gulp工作流

    小屁活动使用 gulp+less gulpfile.js var gulp = require('gulp'), cssmin = require('gulp-minify-css'), less = ...

  4. JS基础题

    1.三目运算符(三元条件语句)的使用方法? 条件表达式?true表达式:false表达式 2.JS数据中哪些属于引用类型? 数组.对象 引用类型变量,变量名所储存的不是变量值,而是变量所在的地址. 3 ...

  5. 2017-12-22 日语编程语言"抚子"-第三版实现初探

    前文日语编程语言"抚子" - 第三版特色初探仅对语言的语法进行了初步了解. 之前的语言原型实现尝试(如编程语言试验之Antlr4+JavaScript实现"圈4" ...

  6. 网页设计编辑利器——jQuery EasyUI所学整理(待编辑)

    1, Messager弹窗信息 方法: $.messager.alert(...), 在网页中间弹出一个窗口 $.messager.confirm(...) 弹出一个确认窗口, 有确定和取消两个按钮, ...

  7. Teaching Machines to Understand Us 让机器理解我们 之一 引言

    Teaching Machines to Understand Us   By Tom Simonite  MIT Technology Review Vol.118 No.5 2015 让机器理解我 ...

  8. 低于0.01%的极致Crash率是怎么做到的?

    WeTest 导读 看似系统Bug的Crash 99%都不是系统问题!本文将与你一起探索Crash分析的科学方法. 在移动互联网闯荡多年的iOS手机管家,经过不断迭代创新,已经涵盖了隐私(加密相册). ...

  9. PB常用事件

    1.window中的事件 事件名                  触发的时机 01.Activate            在窗口激活之前触发 02.Clicked             当用户用 ...

随机推荐

  1. Opengl场景中加光照包含几个步骤

    http://zuoye.baidu.com/question/44e2a82d7ad5c0e1d33ddb9a40e0bf86.html  Opengl场景中加光照包含几个步骤,各个步骤实现用的函数 ...

  2. linux用户态定时器的使用---19【转】

    转自:http://www.cnblogs.com/zxouxuewei/p/5095288.html 原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuew ...

  3. Mac下jdk多版本管理

    网上试了.bash_profile中增加路径设置别名的方法,但是始终无法切换,只能使用jenv了. 1. 下载 jenv(来自官网) git clone https://github.com/gcui ...

  4. Android (Notification)消息推送机制

    从网上查询资料学习Android消息推送机制,效果图如下: 1.首先是布局文件代码 activity_main.xml <?xml version="1.0" encodin ...

  5. 读取EXCEL的办法

    private void button9_Click(object sender, EventArgs e) { var folder =new FolderBrowserDialog(); if ( ...

  6. Spring Cloud之分布式配置中心

    用服务的方式来实现 ConfigAppApplication.java package com.packtpub.ConfigApp; import org.springframework.boot. ...

  7. string那些事之replace

    /* 用法一: 用str替换指定字符串从起始位置pos开始 长度为为len的字符串 string &replace(size_t pos, size_t len, const string&a ...

  8. servlet之request

    1. request的setAttribute与getAttribute方法一般都是成对出现的,首先通过setAttribute方法设置属性与属性值,然后通过getAttribute方法根据属性获取到 ...

  9. bzoj2301(莫比乌斯反演)

    bzoj2301 题意 求区间 [a, b] 和 区间 [c, d] 有多少对数 (x, y) 使得 gcd(x, y) = k . 分析 参考ppt 参考blog 考虑用容斥分成四次查询, 对于每次 ...

  10. (寒假集训)Watering the Fields (最小生成树)

    Watering the Fields 时间限制: 1 Sec  内存限制: 64 MB提交: 26  解决: 10[提交][状态][讨论版] 题目描述 Due to a lack of rain, ...