文章大纲

一、什么是Material Dialogs
二、Material Dialogs实战
三、项目源码下载

 

一、什么是Material Dialogs

  Material Dialogs是一个漂亮、流畅、可定制的对话框,核心模块包含创建基本、列表、单/多选项、进度、输入等对话框。

二、Material Dialogs实战

使用注意点:
(1)使用MaterialDialog的Activity需要继承AppCompat
(2)默认的MaterialDialog在点击空白位置时候会自动关闭弹出框,取消dialog以外的区域的点击事件代码如下

  1. //取消dialog以外的区域的点击事件(默认为true)这里我们设置成false就ok啦
  2. .canceledOnTouchOutside(false)

1. 添加依赖

  1. //添加material-dialogs依赖
  2. //核心模块的依赖
  3. implementation 'com.afollestad.material-dialogs:core:0.9.1.0'
  4. //公共模块的依赖
  5. //公共模块包含不是每个人都需要的扩展库。 这包括 ColorChooserDialog、FolderChooserDialog、Material Preference 类和 MaterialSimpleListAdapter / MaterialSimpleListItem
  6. implementation 'com.afollestad.material-dialogs:commons:0.9.1.0'

2. 创建基本弹框

  1. new MaterialDialog.Builder(MainActivity.this)
  2. .title("标题")
  3. .content("内容")
  4. .positiveText("确认")
  5. .negativeText("取消")
  6. .show();

运行结果如下:

 

温馨提示:取消弹框采用dialog.dismiss();

3. 创建带图标弹框(包含两个按钮)

  1. new MaterialDialog.Builder(MainActivity.this)
  2. .title("标题")
  3. .content("内容;测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度测试长度")
  4. .positiveText("确认")
  5. .negativeText("取消")
  6. .icon(getResources().getDrawable(R.drawable.ic_launcher))
  7. .show();

运行结果如下:

 

温馨提示:可以用maxIconSize(int size)限制图标最大size

4. 创建带三个按钮弹框

  1. new MaterialDialog.Builder(MainActivity.this)
  2. .title("标题")
  3. .content("内容")
  4. .positiveText("确认")
  5. .negativeText("取消")
  6. .neutralText("更多")
  7. .show();

运行结果如下:

 

5. 创建带点击事件的弹出框

  1. //如果你想监听三种动作按钮,只用一个onAny就行了,which会告诉你点击了什么按钮,根据需要去判断,which.toString()的名字分别是Positive,Negative等
  2. //new MaterialDialog.Builder(this)
  3. // .title("标题")
  4. // .content("内容")
  5. // .positiveText("确认")
  6. // .negativeText("取消")
  7. // .neutralText("更多")
  8. // .onAny(new MaterialDialog.SingleButtonCallback() {
  9. // @Override
  10. // public void onClick(MaterialDialog dialog, DialogAction which) {
  11. // Toast.makeText(MainActivity.this, which.toString(), Toast.LENGTH_SHORT).show();
  12. // }
  13. // })
  14. // .show();
  15. click_button = (Button)findViewById(R.id.click_button);
  16. click_button.setOnClickListener(new View.OnClickListener() {
  17. @Override
  18. public void onClick(View v) {
  19. new MaterialDialog.Builder(MainActivity.this)
  20. .title("标题")
  21. .content("内容")
  22. .positiveText("确认")
  23. .negativeText("取消")
  24. .neutralText("更多")
  25. .onPositive(new MaterialDialog.SingleButtonCallback() {
  26. @Override
  27. public void onClick(MaterialDialog dialog, DialogAction which) {
  28. Toast.makeText(MainActivity.this, "点击了确认按钮", Toast.LENGTH_SHORT).show();
  29. }
  30. })
  31. .onNeutral(new MaterialDialog.SingleButtonCallback() {
  32. @Override
  33. public void onClick(MaterialDialog dialog, DialogAction which) {
  34. Toast.makeText(MainActivity.this, "点击了更多按钮", Toast.LENGTH_SHORT).show();
  35. }
  36. })
  37. .onNegative(new MaterialDialog.SingleButtonCallback() {
  38. @Override
  39. public void onClick(MaterialDialog dialog, DialogAction which) {
  40. Toast.makeText(MainActivity.this, "点击了取消按钮", Toast.LENGTH_SHORT).show();
  41. }
  42. })
  43. .show();
  44. }
  45. });

运行结果如下:

 
 

6. 创建是否不再询问弹出框

  1. new MaterialDialog.Builder(MainActivity.this)
  2. .title("标题")
  3. .content("内容")
  4. .positiveText("确认")
  5. //第二次参数代表初始状态是否为勾选
  6. .checkBoxPromptRes(R.string.isShowAgain, true, null)
  7. .onAny(new MaterialDialog.SingleButtonCallback() {
  8. @Override
  9. public void onClick(MaterialDialog dialog, DialogAction which) {
  10. //dialog.isPromptCheckBoxChecked()+""如果返回true,表示用户勾选了,false表示没有
  11. Toast.makeText(MainActivity.this, dialog.isPromptCheckBoxChecked()+"", Toast.LENGTH_SHORT).show();
  12. }
  13. })
  14. .show();

运行结果如下:

 

7. 创建不带样式列表单选框

  1. final String[] array = {"aa","bb"};
  2. new MaterialDialog.Builder(MainActivity.this)
  3. .title("标题")
  4. .positiveText("确认")
  5. .negativeText("取消")
  6. .items(array)
  7. .itemsCallback(new MaterialDialog.ListCallback() {
  8. @Override
  9. public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
  10. Toast.makeText(MainActivity.this, which+"", Toast.LENGTH_SHORT).show();
  11. }
  12. })
  13. .show();

运行结果如下:

 

8. 创建带样式的列表单选框

  1. new MaterialDialog.Builder(MainActivity.this)
  2. .title("标题")
  3. .items(array)
  4. .itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {
  5. @Override
  6. public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
  7. return true;
  8. }
  9. })
  10. .show();

运行结果如下:

 

9. 创建多选列表

  1. new MaterialDialog.Builder(MainActivity.this)
  2. .title("标题")
  3. .positiveText("确认")
  4. .items(array)
  5. .itemsCallbackMultiChoice(null, new MaterialDialog.ListCallbackMultiChoice() {
  6. @Override
  7. public boolean onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text) {
  8. return true;
  9. }
  10. })
  11. .show();

运行结果如下:

 

10. 创建自定义视图

  1. new MaterialDialog.Builder(MainActivity.this)
  2. .title("Title")
  3. .customView(R.layout.activity_main, true)
  4. .positiveText("CHOOSE")
  5. .show();

运行结果如下:

 

11.创建带限制的输入框

  1. new MaterialDialog.Builder(MainActivity.this)
  2. .title("Title")
  3. //限制输入的长度
  4. .inputRangeRes(2, 20, R.color.colorPrimary)
  5. //限制输入类型
  6. .inputType(InputType.TYPE_CLASS_PHONE)
  7. .input("哈哈哈", null, new MaterialDialog.InputCallback() {
  8. @Override
  9. public void onInput(MaterialDialog dialog, CharSequence input) {
  10. Toast.makeText(MainActivity.this, input, Toast.LENGTH_SHORT).show();
  11. }
  12. })
  13. .positiveText("确定")
  14. .show();

运行结果如下:

 

12. 创建等待提示框(圆圈加载)

  1. new MaterialDialog.Builder(MainActivity.this)
  2. .title("提示框")
  3. .content("请稍等...")
  4. .progress(true, 0)
  5. .show();

运行结果如下:

 

13. 创建等待提示框(水平加载)

  1. new MaterialDialog.Builder(MainActivity.this)
  2. .title("提示框")
  3. .content("请稍等...")
  4. .progress(true, 0)
  5. .progressIndeterminateStyle(true)
  6. .show();

运行结果如下:

 

14. 创建带进度条的等待框

  1. new MaterialDialog.Builder(MainActivity.this).title("Progress").content("please wait...").contentGravity(GravityEnum.CENTER).progress(false, 100, true).cancelListener(dialog -> {
  2. if (thread != null) {
  3. thread.interrupt();
  4. }
  5. }).showListener(dialogInterface -> {
  6. final MaterialDialog dialog = (MaterialDialog) dialogInterface;
  7. startThread(() -> {
  8. while (dialog.getCurrentProgress() != dialog.getMaxProgress() && !Thread.currentThread().isInterrupted()) {
  9. if (dialog.isCancelled()) {
  10. break;
  11. }
  12. try {
  13. Thread.sleep(50);
  14. } catch (InterruptedException e) {
  15. break;
  16. }
  17. dialog.incrementProgress(1);
  18. }
  19. runOnUiThread(() -> {
  20. thread = null;
  21. dialog.setContent(getString(R.string.md_done_label));
  22. });
  23. });
  24. }).show();

运行结果如下:

 
 

15.其他功能

(1)MaterialDialog可以通过以下方式设置颜色

  1. // .titleColorRes(R.color.material_red_500)
  2. // .contentColor(Color.WHITE) // notice no 'res' postfix for literal color
  3. // .linkColorAttr(R.attr.my_link_color_attr) // notice attr is used instead of none or res for attribute resolving
  4. // .dividerColorRes(R.color.material_pink_500)
  5. // .backgroundColorRes(R.color.material_blue_grey_800)
  6. // .positiveColorRes(R.color.material_red_500)
  7. // .neutralColorRes(R.color.material_red_500)
  8. // .negativeColorRes(R.color.material_red_500)
  9. // .widgetColorRes(R.color.material_red_500)
  10. // .buttonRippleColorRes(R.color.material_red_500)

(2)通过以下方式设置MaterialDialog主题

  1. .theme(Theme.DARK)

(3)设置文字、按钮等内容的位置

  1. .titleGravity(GravityEnum.CENTER)
  2. .contentGravity(GravityEnum.CENTER)
  3. .btnStackedGravity(GravityEnum.START)
  4. .itemsGravity(GravityEnum.END)
  5. .buttonsGravity(GravityEnum.END)

(4)改变drawable被点击或聚焦时的状态

  1. .btnSelector(R.drawable.custom_btn_selector)
  2. .btnSelector(R.drawable.custom_btn_selector_primary, DialogAction.POSITIVE)
  3. .btnSelectorStacked(R.drawable.custom_btn_selector_stacked)
  4. .listSelector(R.drawable.custom_list_and_stackedbtn_selector)!

三、项目源码下载

链接:https://pan.baidu.com/s/1dJFaw1xfvaOiI8XGPwwaRg
密码:sfd8

Android之Material Dialogs详解的更多相关文章

  1. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  2. [转]ANDROID L——Material Design详解(动画篇)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 转自:http://blog.csdn.net/a396901990/article/de ...

  3. 转:android Support 兼容包详解

    本文转自stormzhang的ANDROID SUPPORT兼容包详解 背景 来自于知乎上邀请回答的一个问题Android中AppCompat和Holo的一个问题?, 看来很多人还是对这些兼容包搞不清 ...

  4. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  5. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  6. android bundle存放数据详解

    转载自:android bundle存放数据详解 正如大家所知道,Activity之间传递数据,是将数据存放在Intent或者Bundle中 例如: 将数据存放倒Intent中传递: 将数据放到Bun ...

  7. Cordova 打包 Android release app 过程详解

    Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...

  8. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  9. 给 Android 开发者的 RxJava 详解

    我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...

随机推荐

  1. python_函数设计

    >>> def check_permission(func): def wrapper(*args,**kwargs): if kwargs.get('username')!='ad ...

  2. 使用libpcap获取http报文

    在上一篇博客中简单对libpcap库基本函数及基本工作流程做了些简单说明, 今天我们先了解一下pcap_loop()及pcap_dispatch()函数的功能及作用: (1)pcap_loop()循环 ...

  3. Java判断字符串是否为数字的自定义方法

    //方法一:用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = str.length();--i>=0;){ ...

  4. SpringCloud实战-Zuul网关服务

    为什么需要网关呢? 我们知道我们要进入一个服务本身,很明显我们没有特别好的办法,直接输入IP地址+端口号,我们知道这样的做法很糟糕的,这样的做法大有问题,首先暴露了我们实体机器的IP地址,别人一看你的 ...

  5. [Linux]Linux 下的 Docker 安装与使用

    一.安装与配置 1.设置阿里云镜像源 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/cen ...

  6. 插入排序算法java

    转自https://blog.csdn.net/jianyuerensheng/article/details/51254415 1.基本思想 直接插入排序的基本操作是将一个记录插入到已经排好的有序表 ...

  7. kv_storage.go

    package storage //kv 存储引擎实现 import (     "github.com/cznic/kv"     "io" ) //kv 存 ...

  8. 安卓---TextVies、Button、EditText

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  9. 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院

    Description 找出1~k短路的长度.   Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...

  10. 已管理员身份从cmd框进入mysql,及常用的简单操作!

    在命令框中操作mysql已管理员的身份进入操作权限较高,已普通用户进入cmd框也可对mysql进行操作,不过一般建议用管理员身份进入. 1.启动MYSQL Notifier 2.已管理员身份进入cmd ...