之前浏览github的时候发现一个比较好用的MD风格的Dialog。这里记录一下使用。 
Github地址:https://github.com/afollestad/material-dialogs

导入

compile 'com.afollestad.material-dialogs:core:0.9.1.0'
compile 'com.afollestad.material-dialogs:commons:0.9.1.0'
  • 1
  • 2

具体的使用

  • Basic Dialog

简单的dialog

                 new MaterialDialog.Builder(MainActivity.this).title("basic dialog").content("一个简单的dialog,高度会随着内容改变,同时还可以嵌套RecyleView").iconRes(R.drawable.icon).positiveText("同意").negativeText("不同意").neutralText("更多信息").widgetColor(Color.BLUE)//不再提醒的checkbox 颜色//CheckBox.checkBoxPrompt("不再提醒", false, new CompoundButton.OnCheckedChangeListener(){@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {if (b) {Toast.makeText(MainActivity.this, "不再提醒", Toast.LENGTH_LONG).show();} else {Toast.makeText(MainActivity.this, "会再次提醒", Toast.LENGTH_LONG).show();}}})//嵌套recycleview,这个的点击事件可以先获取此Recycleview对象然后自己处理.adapter(new RecycleviewAdapter(getData(), MainActivity.this), new LinearLayoutManager(MainActivity.this)).itemsCallback(new MaterialDialog.ListCallback() {@Overridepublic void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) {dataChoose = "下标:" + position + " and 数据:" + mData.get(position);}})//点击事件添加 方式1.onAny(new MaterialDialog.SingleButtonCallback() {@Overridepublic void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {if (which == DialogAction.NEUTRAL) {Toast.makeText(MainActivity.this, "更多信息", Toast.LENGTH_LONG).show();} else if (which == DialogAction.POSITIVE) {Toast.makeText(MainActivity.this, "同意" + dataChoose, Toast.LENGTH_LONG).show();} else if (which == DialogAction.NEGATIVE) {Toast.makeText(MainActivity.this, "不同意", Toast.LENGTH_LONG).show();}}}).show();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

相应的效果: 
简单的diaolog,同意和不同意的字体颜色是默认是R.color.colorAccent

文本变多的时候会自动拉长高度

嵌套一个recycleview,这个的点击事件可以先获取此Recycleview对象然后自己处理

  .adapter(new RecycleviewAdapter(getData(), MainActivity.this), new LinearLayoutManager(MainActivity.this))//
RecycleView rc=  dialog.getRecyclerView();
  • 1
  • 2
  • 3
  • 4

这里添加一个更多信息的按钮

 .neutralText("更多信息")
  • 1

点击事件

  • 方式一
 .onAny(new MaterialDialog.SingleButtonCallback() {@Overridepublic void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {if (which == DialogAction.NEUTRAL) {Toast.makeText(MainActivity.this, "更多信息", Toast.LENGTH_LONG).show();} else if (which == DialogAction.POSITIVE) {Toast.makeText(MainActivity.this, "同意" + dataChoose, Toast.LENGTH_LONG).show();} else if (which == DialogAction.NEGATIVE) {Toast.makeText(MainActivity.this, "不同意", Toast.LENGTH_LONG).show();}}})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  public Builder onAny(@NonNull SingleButtonCallback callback) {this.onAnyCallback = callback;return this;}public interface SingleButtonCallback {void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which);}public enum DialogAction {POSITIVE,NEUTRAL,NEGATIVE
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

就是传一个SingleButtonCallback 接口,用DialogAction 来区分现在是那个Action 请求,然后对应的处理

  • 方式二
.onPositive(new MaterialDialog.SingleButtonCallback() {@Overridepublic void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {Toast.makeText(MainActivity.this,"同意",Toast.LENGTH_LONG).show();}})
//.onNegative()
//.onNeutral()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

单个按钮添加监听和onAny 其实一样

  • 方式三

这个方法已经过时了

.callback(new MaterialDialog.ButtonCallback() {//添加按钮点击监听@Overridepublic void onPositive(MaterialDialog dialog) {super.onPositive(dialog);Toast.makeText(MainActivity.this,"同意",Toast.LENGTH_LONG).show();}@Overridepublic void onNegative(MaterialDialog dialog) {super.onNegative(dialog);Toast.makeText(MainActivity.this,"不同意",Toast.LENGTH_LONG).show();}@Overridepublic void onNeutral(MaterialDialog dialog) {super.onNeutral(dialog);Toast.makeText(MainActivity.this,"更多信息",Toast.LENGTH_LONG).show();}})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

添加checkbox

 .checkBoxPrompt("不再提醒", false, new CompoundButton.OnCheckedChangeListener() {//check事件@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {if (b) {Toast.makeText(MainActivity.this, "不再提醒", Toast.LENGTH_LONG).show();} else {Toast.makeText(MainActivity.this, "会再次提醒", Toast.LENGTH_LONG).show();}}})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  • 颜色修改
  .widgetColor(Color.BLUE)
  • 1

其他属性介绍

 .btnSelector(R.color.colorPrimary)//按钮的背景颜色//分开设置2个按钮的背景颜色
//  .btnSelector(R.color.colorPrimary, DialogAction.NEGATIVE)
//  .btnSelector(R.color.colorPrimaryDark, DialogAction.POSITIVE)
//  .btnSelector(R.color.colorPrimary,DialogAction.NEUTRAL)
//  .backgroundColor(Color.parseColor("#FF9988"))//dialog的背景颜色
//  .contentColor(Color.WHITE)//内容字体的颜色
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • List Dialogs

列表弹框,.item ()来添加类别内容,也可以是

 .items(new String[]{"AAAA","BBBBB","CCCCC","DDDDDDDD","EEEEE","FFFFFF","GGGGGG","HHHHHHH"})
  • 1
     new MaterialDialog.Builder(MainActivity.this).title("List Dialog").iconRes(R.drawable.ic_logo).content("List Dialog,显示数组信息,高度会随着内容扩大")                           .items(R.array.item)//.listSelector(R.color.green)//列表的背景颜色.autoDismiss(false)//不自动消失.show();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  • 列表点击事件
   .itemsCallback(new MaterialDialog.ListCallback() {//选中监听,同时dialog消失@Overridepublic void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) {dataChoose += "下标:" + position + " and 数据:" + text;Toast.makeText(MainActivity.this, dataChoose, Toast.LENGTH_LONG).show();}})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 添加单选
  //单选.itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {//0 表示第一个选中 -1 不选@Overridepublic boolean onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) {dataChoose="此时选中的下标"+which;Toast.makeText(MainActivity.this,dataChoose,Toast.LENGTH_LONG).show();return true;}})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • Multi Choice List Dialogs

多选dialog

                     new MaterialDialog.Builder(MainActivity.this).title("Multi Choice List Dialogs").iconRes(R.drawable.ic_logo).content("Multi Choice List Dialogs,显示数组信息,高度会随着内容扩大.可以多选").items(R.array.item).positiveText("确定").widgetColor(Color.RED)//改变checkbox的颜色//多选框添加.itemsCallbackMultiChoice(null, new MaterialDialog.ListCallbackMultiChoice() {@Overridepublic boolean onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text) {return true;//false 的时候没有选中样式}})//点击确定后获取选中的下标数组.onPositive(new MaterialDialog.SingleButtonCallback() {@Overridepublic void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {dialog.dismiss();Toast.makeText(MainActivity.this, "选中" + dialog.getSelectedIndices().length + "个", Toast.LENGTH_LONG).show();}}).show();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

这里有一个itemsCallbackMultiChoice()他的返回结果决定了checkbox 是否有选中和取消的效果。

  • Custom Views

可以引入外部view的dialog

    new MaterialDialog.Builder(MainActivity.this).customView(R.layout.custome_view,false).show();             
  • 1
  • 2
  • 3

效果: 

customView( int layoutRes, boolean wrapInScrollView) 
当我们将wrapInScrollView设置为true的时候就表示需要一个padding

假设布局中有个按钮我们要点击这个按钮关闭dialog可以这样操作

final MaterialDialog dialog = new MaterialDialog.Builder(MainActivity.this).customView(R.layout.custome_view, false).show();View customeView = dialog.getCustomView();Button button = (Button) customeView.findViewById(R.id.btn_closeCustome);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dialog.dismiss();}});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • Input Dialogs

含有输入框的弹框

             new MaterialDialog.Builder(MainActivity.this).title("输入窗").iconRes(R.drawable.ic_logo).content("包含输入框的diaolog")
//                                .widgetColor(Color.BLUE)//输入框光标的颜色.inputType(InputType.TYPE_CLASS_PHONE)//可以输入的类型-电话号码//前2个一个是hint一个是预输入的文字.input(R.string.input_hint, R.string.input_prefill, new MaterialDialog.InputCallback() {@Overridepublic void onInput(@NonNull MaterialDialog dialog, CharSequence input) {Log.i("yqy", "输入的是:" + input);}}).onPositive(new MaterialDialog.SingleButtonCallback() {@Overridepublic void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {if (dialog.getInputEditText().length() <=10) {dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false);}else {dialog.getActionButton(DialogAction.POSITIVE).setEnabled(true);}}}).show();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

限制条件

输入类型是 .inputType(InputType.TYPE_CLASS_PHONE)//可以输入的类型-电话号码,限制输入长度是inputRange(11, 41, R.color.colorAccent)//限制输入的长度,只有在(11,41)长度内ok按钮才是可用的。限制长度还可以是在onInput()方法里处理。

if (dialog.getInputEditText().length() < 10) {dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false);}else{dialog.getActionButton(DialogAction.POSITIVE).setEnabled(true);}while (dialogPro.getCurrentProgress()!=dialogPro.getMaxProgress()){if (dialogPro.isCancelled()) break;try {Thread.sleep(50);//模拟加载时间} catch (InterruptedException e) {break;}dialogPro.incrementProgress(1);}dialogPro.setContent("加载完成");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • Progress Dialog

进度条弹框应该是用的比较多的了,但是这个的我感觉用起来不好,一般的点击加载进度

设置成水平的进度条

 .progress(false, 100, true).progressNumberFormat("%1d/%2d")
  • 1
  • 2

//progress(boolean indeterminate, int max, boolean showMinMax) 
// false 的话是水平进度条,true是等待圆环 最大值 是否显示数值,false的时候是不可以用progress这类的属性的灰报错:Cannot use setProgress() on this dialog.

没有一个加载进度的过程
  • 1

  • ColorDialog

有关颜色选择的相关弹框,选择的时候实现选择的回掉接口:ColorChooserDialog.ColorCallback

  @Overridepublic void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) {//此时选择的颜色}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
new ColorChooserDialog.Builder(MainActivity.this,R.string.app_name).titleSub(R.string.input_hint)  // title of dialog when viewing shades of a color.accentMode(false)  // when true, will display accent palette instead of primary palette.doneButton(R.string.md_done_label)  // changes label of the done button.cancelButton(R.string.md_cancel_label)  // changes label of the cancel button.backButton(R.string.md_back_label)  // changes label of the back button.preselect(Color.RED)  // 开始的时候的默认颜色.dynamicButtonColor(true)  // defaults to true, false will disable changing action buttons' color to currently selected color.show();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可以自己定义筛选的颜色

int[] primary = new int[] {Color.parseColor("#F44336")};int[][] secondary = new int[][] {new int[] { Color.parseColor("#EF5350"), Color.parseColor("#F44336"), Color.parseColor("#E53935") }};new ColorChooserDialog.Builder(MainActivity.this, R.string.app_name)
//                .titleSub(R.string.app_name).customColors(primary, secondary).doneButton(R.string.done).cancelButton(R.string.cancel).titleSub(R.string.done)//设置二级选择的标题
//                .presetsButton(R.string.input_hint)//从RRGB切换到CUstome的文字提示.show();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

     new ColorChooserDialog.Builder(MainActivity.this, R.string.app_name).allowUserColorInput(false).customButton(R.string.md_custom_label).presetsButton(R.string.md_presets_label).show();
  • 1
  • 2
  • 3
  • 4
  • 5

  • File Selector Dialogs

文件弹框

  new FileChooserDialog.Builder(MainActivity.this).initialPath("/sdcard/Download")  // changes initial path, defaults to external storage directory.mimeType("image/*") // Optional MIME type filter.extensionsFilter(".png", ".jpg") // Optional extension filter, will override mimeType().tag("optional-identifier").goUpLabel("Up") // custom go up label, default label is "...".show();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

实现接口 
@Override 
public void onFileSelection(@NonNull FileChooserDialog dialog, @NonNull File file) { 
//选择文件 
}

demo下载

Android开发----MaterialDesign设计下material-dialogs用法相关推荐

  1. android 4.4 禁止下拉,Android开发中禁止下拉式的实现技巧

    我们开发项目的时候,经常会看到禁止的情况,而Android开发中并没有直接调用的接口,下面是爱站技术频道小编就给大家介绍的Android开发中禁止下拉式的实现技巧,希望网友们喜欢! 分享给大家供大家参 ...

  2. Android中layout目录的作用,Android 开发中layout下的子文件夹

    Android 开发中layout下的子文件夹 发布时间:2020-10-25 11:42:36 来源:脚本之家 阅读:71 作者:厚土火焰山 如果一个项目内有很多个界面,那么在layout下会有太多 ...

  3. Android开发——如何设计开发一款Android App

    本文从开发工具选择,UI界面.图片模块.网络模块.数据库产品选择.性能.安全性等几个方面讲述了如果开发一个Android应用.现在整理出来分享给广大的Android程序员兄弟们. 开发工具的选择 开发 ...

  4. Android开发:Kotlin下配置DataBinding

    近日,随着Google召开了Google I/O 2017,Kotlin大火一把.因为Google宣布Kotlin为First-class开发语言作 为一名Kotlin忠实粉丝,高兴地很呀.虽然短 时 ...

  5. android开发还原设计稿,TextView设计稿完美还原思考

    在开发工程师与设计师配合过程中,经常会遇到的问题就是设计师提供设计图,开发工程师严格按照设计图开发完成,但结果就是无法做到设计稿完美还原,需要在后期进行视觉走查的过程中进行微调,占用开发时间,本着效率 ...

  6. android输出log,Android开发 Release情况下也能输出log

    一般我们开发程序都是在debug模式下开发,打log很方便,什么log.v.log.d.log.i都热别好使,但是到了要发布时我们通常要打release版包,在release版下做测试也是必需的,为了 ...

  7. android抽屉风格,Android开发实战之拥有Material Design风格的抽屉式布局

    在实现开发要求中,有需要会使用抽屉式布局,类似于QQ5.0的侧滑菜单,实现的方式有很多种,可以自定义控件,也可以使用第三方开源库. 同样的谷歌也推出了自己的侧滑组件--DrawLayout,使用方式也 ...

  8. Android开发:CoordinatorLayout下的滑动异常(RecyclerView)

    接手的项目因为用了BRVAH中的OnLoadMore,同时要外包裹接上下拉刷新加载.和NestedScrollView有冲突.所以用了CoordinatorLayout (框架的陈年bug,简单来说就 ...

  9. android开发 spinner,Spinner的三种用法

    方式一.如果是固定的数据,直接在values下创建arrays.xml A B C D E F G 然后在布局文件里通过android:entries引用就可以了 android:id="@ ...

  10. android测试 课程设计,超星尔雅Android开发课程设计章节测试答案

    超星程设3.输送尿液的器官是 工厂电力线路的接线方式有.尔雅.. 一般情况下,发课工频的频率偏差一般不超过Hz 计章节测中性点接地是接地 对继电保护的基本要求包括.试答... 超星程设电力变压器的通常 ...

最新文章

  1. php数组指针什么用,php数组指针用法详解
  2. web开发语言大盘点
  3. 【转】一篇比较清晰简单的C++文件操作
  4. “越级”的两年后,科技潮牌realme与年轻人进行了一次深度对话
  5. 朱啸虎:几百亿资金今年注入小程序,你能抓住机会吗?
  6. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
  7. bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】
  8. MySql 存储过程 退出
  9. RStudio的下载与安装
  10. java中class.forName和classLoader加载类的区分
  11. 利用SPSS做数据分析②之数据处理1
  12. ERP原理及应用教程-第五章
  13. [预推免]——中科院计算所
  14. 【ACCV2022】论文阅读笔记Lightweight Alpha Matting Network Using Distillation-Based Channel Pruning
  15. 数据架构建设方法及案例
  16. uni-app - Refused to display ‘xxx‘ in a frame because an ancestor violates the following Content Sec
  17. 9 * 9 数独求解
  18. 未来五年有颠覆性的IT技术都在这里
  19. nginx的负载均衡模块详解
  20. 产品经理常见面试题目——HR问题

热门文章

  1. psd导出jpg太大_为什么我最近PS存出来 的JPG图片都很大
  2. 关于判断单峰数组的几种方法
  3. 【摘抄】为什么要学C语言
  4. 存在隐患 : 此角色的 日志目录 所在的文件系统的可用空间小于 10.0 吉字节。 /var/log/hive(可用:9.9 吉字节 (28.12%),容量:35.1 吉字节)
  5. Asp.Net Core 系列教程 (三)身份认证
  6. 「Wekan」- 看板工具 @20210403
  7. 什么是物联网技术
  8. 服务器2008系统设置密码,win2008服务器设置密码
  9. python npv 计算公式_Python中IRR的计算
  10. 移动计算机无线网络,【移动网络论文】计算机无线网络安全技术应用(共3819字)...