【FasterDialog】可能是Android上最好用的Dialog框架

https://github.com/XXQAQ/FasterDialog

前言:FasterDialog是一个完全解耦弹窗逻辑与布局样式的三方框架,即便你的众多项目有不同的布局样式需求,只要引入FasterDialog就可以让你的所有项目都用同一份代码描述业务逻辑。

在你的项目设计中,你的UI设计师曾可能提过如下需求:

图1
图2
图3

针对以上的各式各样的需求,以前我们会在每个项目编写满足对应项目需要的Dialog。实际上,在自定义Dialog的过程中,我们发现除了布局或者控件位置样式等属性不同之外,剩余百分之90的逻辑代码都是相似或相同的。

那么,有没有那么一种办法,可以让我们无需书写这百分之90的重复性代码,通过某种协议协定一些规则,使我们的代码兼容所有的UI场景,而在使用的过程,只需要通过一个简单方法就可以将Dialog样式切换到指定布局方案。如下所示

//使用上图1的布局方案

new NormalDialog(getContext()).setCustomView(R.layout.layout_1).setTitle("删除").setContent("确定要删除所选的一个会话吗?").setPositiveText("删除").setNegativeText("取消").show();

//使用上图2的布局方案

new NormalDialog(getContext()).setCustomView(R.layout.layout_2).setTitle("账号在其他设备登陆").setContent("您的支付宝账号于...(内容过长遂省略)").setPositiveText("好的").setNegativeText("重置密码").show();

//使用上图3的布局方案

new NormalDialog(getContext()).setCustomView(R.layout.layout_3).setTitle("确定注销").setContent("确定注销当前账号?").setPositiveText("确定").setNegativeText("取消").show();

是的,FasterDialog的设计理念就是如此!每当我们有新的UI需求,保持代码层无需改动自行编写项目所需要的布局文件,通过设定不同的layout就可以将Dialog切换至不同的布局方案。这样具备极高的解耦性,也大大降低了代码维护成本。So,为了使程序员不再重复写百分之90的代码而专精于业务需求,设计了FasterDialog。

除此之外,FasterDialog还具备以下特性:

1.动态变化;即使在Dialog show出来以后,依然可以通过setTitle setXXX这样的方法动态改变Dialog中显示的内容

2.无需权限,无Activity环境弹窗

3.封装了一些Dialog常用但实现略微繁琐的方法;一个方法就可以让你的Dialog实现如 底部弹窗(是的,官方的BottomDialog被FasterDialog一个方法即可取代),顶部弹窗,宽高屏占比,最大宽高值,自动消失等功能

4.其他:链式调用、扩展预留


Dialog分类

在介绍分类之前,我们先翻阅官方AlertDialog的源码。给我的第一感受是功能冗杂,API繁多。明明有很多方法只能在特定场景下使用,放在子类更合适,但AlertDialog偏偏全都强行加了进去。首先从设计上来说不利于后续扩展,而且由于身兼多职也导致无法专精于某一个模块。

所以考虑到此,FasterDialog细分了各个模块的作用域,针对App上常见的Dialog类型进行了如下分类:

LoadingDialog


NormalDialog


ImageDialog


ProgressDialog


ListDialog


EditDialog

如上图所示,不同的Dialog专精于不同的模块,不会出现功能混杂的情况。当然,如果我制定的Dialog不满足你的项目需求,你也可以直接继承对应的Dialog,不需要大刀阔斧地修改,几分钟之内就可在项目中使用。

PS:再次强调,以上所有效果图仅为FasterDialog自带默认布局方案,除此之外FasterDialog还包含Meterail布局方案,你也可以自行编写xml布局,Dialog最终效果由你自己决定。


API

所有Dialog通用方法

BaseDialog dialog;        //所有Dialog均继承于BaseDialog,因此所有子类均可调用以下方法。

dialog.setCustomView()//设置弹窗的layoutID,默认已有

      .setWidth()//设置弹窗宽度(单位px)

      .setWidthWrap()//设置弹窗宽为内容包裹

      .setWidthMatch()//设置弹窗宽为填充屏幕

      .setWidthPercent()//设置弹窗宽度占屏幕宽度的百分比(取值范围0-1.0)

.setMaxWidth()//设置弹窗最大宽度(单位px)

      .setHeight()//设置弹窗高度(单位px)

.setHeightWrap()//设置弹窗高为内容包裹

      .setHeightMatch()//设置弹窗高为填充屏幕

.setHeightPercent()//设置弹窗宽度占屏幕高度的百分比(取值范围0-1.0)

      .setMaxHeight()//设置弹窗最大高度(单位px)

      .setX()//设置弹窗的横坐标

.setY()//设置弹窗的纵坐标

      .setPopupFromBottom()//设置弹窗从底部弹窗,并且沉在底部(仿MIUI)

      .setPopupFromTop()//设置弹窗从顶部弹窗,并且浮在顶部

      .setCancel()//设置弹窗是否可被取消

.setCancelOutside()//设置弹窗是否可点击外部空间后消失

      .setAutoDismissTime()//设置弹窗自动消失时间

      .setAnimatStyle()//设置弹窗的出现消失动画

      .setTag()//设置TAG

      .addOnCancelListener()//添加弹窗取消监听

.addOnDismissListener()//添加弹窗消失监听

      .addOnShowListener()//添加弹窗显示监听

      .show();    //显示

dialog.dismiss();//隐藏

LoadingDialog

LoadingDialog dialog = new LoadingDialog(this);

dialog.setLodingText("加载中...")//设置加载文字

          .show();

NormalDialog

NormalDialog dialog = new NormalDialog(this);

dialog

//            .setCustomView(NormalDialog.LAYOUT_XQ)      //默认布局方案

//            .setCustomView(NormalDialog.LAYOUT_METERAIL)//Meterail布局方案

//            .setCustomView(R.layout.yourlayout)    //设置你自己的布局方案

            .setIcon(0)        //设置图标,支持GIF图片

            .setTitle("标题")  //设置标题

            .setContent("内容") //设置内容

            .setPositiveText(NormalDialog.SURE) //设置确认文字

            .setPositiveListener(null)  //设置确认监听

            .setNegativeText(NormalDialog.CANCLE)//设置取消文字

            .setNegativeListener(null)  //设置取消监听

            .setNeutralText("其他")    //设置中立文字

            .setNeutralListener(null)  //设置中立监听

//            .setData()//一个方法即可设置以上所有内容

            .show();

ImageDialog

ImageDialog dialog = new ImageDialog(this);//ImageDialog继承于NormalDialog,可以使用NormalDialog的所有方法

dialog

//            .setCustomView(ImageDialog.LAYOUT_XQ)      //默认布局方案

//            .setCustomView(R.layout.yourlayout)    //设置你自己的布局方案

            .setIcon(0) //设置图标,支持GIF图片

            .setTitle("标题") //设置标题

            .setContent("内容") //设置内容

            .setPositiveText(NormalDialog.SURE) //设置确认文字

            .setPositiveListener(null) //设置确认监听

            .setNegativeText(NormalDialog.CANCLE)//设置取消文字

            .setNegativeListener(null) //设置取消监听

            .setNeutralText("其他") //设置中立文字

            .setNeutralListener(null) //设置中立监听

//          .setImageRes()  //设置大图的资源ID,与下方法不要同时使用

            .setImageUrl("http://t2.hddhhn.com/uploads/tu/201610/198/hkgip2b102z.jpg")  //设置大图的路径地址,支持本地图片的同时也支持网络图片,与上方法不要同时使用

//          .setData()//一个方法即可设置以上所有内容

//          .setDialogImageLoder()  //建议使用Glide或者其他图片加载器加载图片,默认加载器不提供三级缓存

            .show();

ProgressDialog

        ProgressDialog dialog = new ProgressDialog(this); //ProgressDialog与NormalDialog均继承于SimpleDialog,因此均可设置title,icon,content等属性

dialog

//            .setCustomView(ProgressDialog.LAYOUT_XQ)      //默认布局方案

//            .setCustomView(ProgressDialog.LAYOUT_METERAIL)      //Meterail布局方案

//            .setCustomView(R.layout.yourlayout)    //设置你自己的布局方案

            .setIcon(0)        //设置图标,支持GIF图片

            .setTitle("标题")  //设置标题

            .setContent("内容") //设置内容             

            .setProgress(50)      //设置进度值(范围0-100)

//                .setProgress(50,"正在删除 /System 文件夹中")//设置进度值+进度描述字符串

            .show();

待完善ListDialog与EditDialog

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,612评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,814评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,427评论 0 239
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,743评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,104评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,455评论 1 214
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,764评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,454评论 0 196
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,159评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,446评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,953评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,294评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,927评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,028评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,784评论 0 193
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,485评论 2 270
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,395评论 2 264

推荐阅读更多精彩内容