不到600行纯代码实现带动画十多种样式Dialog

SuperDialog

一个类文件不到600行纯代码实现多功能Dialog,list、image、input输入框、Progress自定义View和可变参数button数量
欢迎star:https://github.com/hnsugar/SuperDialog

Github:https://github.com/hnsugar/

http://itgowo.com

QQ:1264957104

Email:lujianchao@itgowo.com

为什么写纯代码Dialog?

我比较追求少而精,同时不想引入太多东西,添加容易,删除是很让人郁闷的,例如
源码导入别人的库到自己项目,我们还要对应放入各种资源文件,久而久之
是不是文件超多,甚至都不知道是干什么的,想清理都难,如果只有一个类就可以了,
那管理起来是不是就方便了许多呢,最重要的是,不用XML定义是很考技术的😁。

本人对大量引入第三方库比较反感,会造成APP体积增大,同时存在兼容性隐患,所以我开发的
项目原则是降低给别人造成麻烦,例如https://github.com/hnsugar/android-debugdata-webtool
这个库是我为测试和开发写的,直接依赖就可使用,可以查看运行时APP内的数据库和共享参数及
data目录文件管理,就这样一个库同时具备web服务器和数据接口功能,其中数据使用Json格式。

但是,除了java和Android基本类是没有引用到第三方Json库的,不过确实用了第三方库,
那就不得不提我另一个库https://github.com/hnsugar/IntelligentTool,自动查找第三方库并使用。
这样我就解决了给使用者带来更多不同版本库的烦恼。

正题

如下全功能展示例子代码就构建了一个全功能的Dialog,如下图,需要注意的是,默认设置列表后就不会显示底部按钮,如果有特殊需要,只需要调整链式调用顺序即可。
还有需要注意的是获取ImageView前必须先show,show操作中增加了初始化操作,不然直接get是null。buttonText设置了有奇效,很多地方都可以混用,但是我希望
开发者按套路出牌,设置成正常的Dialog:-D。

  1. 下方按钮是代码设置drawable,根据位置设置圆角位置
  2. 相应类型方法不调用默认规则是不显示对应类型组件。
  3. 部分方法会强制相应方法设置值,但是调整调用顺序可以重新覆盖为最新设置。
    (栗子:显示列表时屏蔽下方按钮显示,但是先调用setDialogMenuItemList()后设置不显示下方按钮,如果后面调用setButtonTexts()则会把下方按钮显示出来,出现参数重置)
  4. 自定义View可以实现更多功能。
  5. 单个文件移植简单,需要定义什么字体颜色什么的自行更改,没必要提供过多的方法。

举个栗子:

全功能展示(链式调用顺序影响具体显示和功能效果)

public void test1(View view) {
    final SuperDialog superDialog = new SuperDialog(this);

    ArrayList<SuperDialog.DialogMenuItem> menuItems = new ArrayList<>();
    menuItems.add(new SuperDialog.DialogMenuItem("收藏", R.mipmap.ic_winstyle_favor));
    menuItems.add(new SuperDialog.DialogMenuItem("下载", R.mipmap.ic_winstyle_download));
    menuItems.add(new SuperDialog.DialogMenuItem("分享", R.mipmap.ic_winstyle_share));
    menuItems.add(new SuperDialog.DialogMenuItem("删除", R.mipmap.ic_winstyle_delete));
    menuItems.add(new SuperDialog.DialogMenuItem("歌手", R.mipmap.ic_winstyle_artist));
    menuItems.add(new SuperDialog.DialogMenuItem("专辑", R.mipmap.ic_winstyle_album));

    superDialog.setTitle("全功能展示Dialog").setContent("纯代码编写,没有使用XML.")
            .setListener(listener).setShowImage().setDialogMenuItemList(menuItems).setButtonTexts(new String[]{"按钮1", "按钮2", "按钮3", "按钮4"}).setImageListener(new SuperDialog.onDialogImageListener() {
        @Override
        public void onInitImageView(ImageView imageView) {
            Glide.with(imageView).load("https://www.baidu.com/img/fnj_96d95207b4a706738f1b8be3b41ea9f3.gif").into(imageView);
        }
    }).setCustomViewListener(new SuperDialog.onDialogCustomViewListener() {
        @Override
        public View onInitCustomView(LinearLayout viewGroup) {
            return new ProgressBar(viewGroup.getContext());
        }
    }).setInputListener(new SuperDialog.onDialogInputListener() {
        @Override
        public void onInitEditText(EditText inputView) {
            inputView.setHint("自定义设置");
        }

        @Override
        public void onComplete(int buttonIndex, String text) {
            Toast.makeText(getApplicationContext(), "输入框:" + text, Toast.LENGTH_SHORT).show();
        }
    }).show();

    superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    });
}
0.png

普通Dialog

public void test2(View view) {
    SuperDialog superDialog = new SuperDialog(this);
    superDialog.setTitle("提示框类型Dialog").setContent("纯代码编写,没有使用XML").setListener(listener).show();
    superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    });
}

!
1.png

无标题Dialog

public void test3(View view) {
    final SuperDialog superDialog = new SuperDialog(this);
    superDialog.setContent("纯代码编写,没有使用XML\r\n没有标题").setListener(listener).show();
    superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    });
}
2.png

两个按钮

 public void test4(View view) {
    final SuperDialog superDialog = new SuperDialog(this);
    superDialog.setTitle("2个button").setContent("纯代码编写,没有使用XML").setListener(listener).setButtonTexts(new String[]{"按钮1", "按钮2"}).show();
    superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    });
}
3.png

三个按钮

public void test5(View view) {
    final SuperDialog superDialog = new SuperDialog(this);
    superDialog.setTitle("3个button").setContent("纯代码编写,没有使用XML").setListener(listener).setButtonTexts(new String[]{"按钮1", "按钮2", "按钮3"}).show();
    superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    });
}
4.png

可变参数设置多个按钮

public void test6(View view) {
    final SuperDialog superDialog = new SuperDialog(this);
    superDialog.setTitle("可变参数N个button").setContent("纯代码编写,没有使用XML\r\n.setButtonTexts(\"按钮1\", \"按钮2\", \"按钮3\", \"按钮4\", \"按钮5\", \"按钮6\")").setListener(listener).setButtonTexts("按钮1", "按钮2", "按钮3", "按钮4", "按钮5", "按钮6").show();
    superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    });
}
5.png

带图片文字

布局addView后回调onInitImageView(),返回ImageView可以自己处理事件和效果
public void test7(View view) {
    final SuperDialog superDialog = new SuperDialog(this);
    superDialog.setTitle("带图片Dialog").setContent("纯代码编写,没有使用XML").setListener(listener).setShowImage().setImageListener(new SuperDialog.onDialogImageListener() {
        @Override
        public void onInitImageView(ImageView imageView) {
            Glide.with(imageView).load("https://www.baidu.com/img/fnj_96d95207b4a706738f1b8be3b41ea9f3.gif").into(imageView);
        }
    }).setButtonTexts(new String[]{"按钮1", "按钮2", "按钮3", "按钮4"}).show();

    superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    });
}
6.png

列表

    public void test8(View view) {
        final SuperDialog superDialog = new SuperDialog(this);

        ArrayList<SuperDialog.DialogMenuItem> menuItems = new ArrayList<>();
        menuItems.add(new SuperDialog.DialogMenuItem("收藏", R.mipmap.ic_winstyle_favor));
        menuItems.add(new SuperDialog.DialogMenuItem("下载", R.mipmap.ic_winstyle_download));
        menuItems.add(new SuperDialog.DialogMenuItem("分享", R.mipmap.ic_winstyle_share));
        menuItems.add(new SuperDialog.DialogMenuItem("删除", R.mipmap.ic_winstyle_delete));
        menuItems.add(new SuperDialog.DialogMenuItem("歌手", R.mipmap.ic_winstyle_artist));
        menuItems.add(new SuperDialog.DialogMenuItem("专辑", R.mipmap.ic_winstyle_album));


        superDialog.setTitle("列表的Dialog").setContent("纯代码编写,没有使用XML").setListener(listener).setDialogMenuItemList(menuItems).show();
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
7.png

单按钮默认样式输入Dialog

布局addView前回调onInitEditText(),返回edittext可以设置事件及效果。
未设置setButtonTexts()则进入判断,如果是输入模式且文本数组为空,则默认文本数组为{"确定"}
public void test9(View view) {
    final SuperDialog superDialog = new SuperDialog(this);


    superDialog.setTitle("输入框Dialog").setContent("纯代码编写,没有使用XML").setInputListener(new SuperDialog.onDialogInputListener() {
        @Override
        public void onInitEditText(EditText inputView) {
            inputView.setHint("请输入文字");
        }

        @Override
        public void onComplete(int buttonIndex, String text) {
            Toast.makeText(getApplicationContext(), "输入框:" + text, Toast.LENGTH_SHORT).show();
        }
    }).show();
    superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    });
}
8.png

自定义多按钮输入Dialog

按钮受setButtonTexts()影响,设置数据会按顺序显示,onComplete()回调会返回文本和点击按钮位置,顺序与设置一致。
public void test10(View view) {
    final SuperDialog superDialog = new SuperDialog(this);


    superDialog.setTitle("输入框Dialog").setContent("纯代码编写,没有使用XML").setButtonTexts("取消", "更改").setInputListener(new SuperDialog.onDialogInputListener() {
        @Override
        public void onInitEditText(EditText inputView) {
            inputView.setHint("请输入文字");
        }

        @Override
        public void onComplete(int buttonIndex, String text) {
            if (buttonIndex == 0) {
                Toast.makeText(getApplicationContext(), "取消输入框:" + text, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "输入框:" + text, Toast.LENGTH_SHORT).show();
            }
        }
    }).show();
    superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    });
}
9.png

等待/进度自定义ViewDialog

public void test11(View view) {
    final SuperDialog superDialog = new SuperDialog(this);

    superDialog.setTitle("进度/等待,自定义View Dialog").setContent("处理进度55%").setShowButtonLayout(false).setCustomViewListener(new SuperDialog.onDialogCustomViewListener() {
        @Override
        public View onInitCustomView(LinearLayout viewGroup) {
            return new ProgressBar(viewGroup.getContext());
        }
    }).show();
    superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    });
}
10.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,085评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,947评论 4 60
  • 另一段有意思的事。这次来自元照。 说employee也可以拼作employe。 这个词来自法语。法语中只有一个e,...
    鱼子酱阅读 448评论 0 1
  • 真的是忙于交际,没有太多精力学习。连写总结的欲望都没有,今天学了朱伟的恋恋有词,明天有机会继续吧。明天应该早点起,...
    muziyue阅读 231评论 0 0
  • 19岁念大学,22岁毕业、工作,24岁结婚。 儿时总是吵闹不安分,大一些时突然有了用不完的冲劲,现在,25岁,...
    能动手就别超超阅读 166评论 0 0