MD 风格的 Dialog ---- MaterialDialog

Posted 持续学习刻意练习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MD 风格的 Dialog ---- MaterialDialog相关的知识,希望对你有一定的参考价值。

一个 MD 风格的 Dialog 的开源项目,GitHub 地址:https://github.com/afollestad/material-dialogs

定义:

MaterialDialog:一个漂亮、流畅、可定制的对话框。

依赖:

  • 核心模块的依赖:compile 'com.afollestad.material-dialogs:core:0.9.6.0'
    核心模块包含该库的所有主要类,包括 MaterialDialog。 您可以使用核心创建基本、列表、单/多选项、进度、输入等对话框。

  • 公共模块的依赖:compile 'com.afollestad.material-dialogs:commons:0.9.6.0'
    公共模块包含不是每个人都需要的扩展库。 这包括 ColorChooserDialog、FolderChooserDialog、Material Preference 类和 MaterialSimpleListAdapter / MaterialSimpleListItem。

demo:

https://github.com/afollestad/material-dialogs/blob/master/sample/sample.apk

使用:

  1. 基本对话框:Basic Dialog
new MaterialDialog.Builder(this)// 初始化建造者
                               .title(R.string.title)// 标题
                               .content(R.string.content)// 内容
                               .positiveText(R.string.agree)
                               .negativeText(R.string.title)
                               .show();// 显示对话框

注意:Activity 中使用该功能需要 Activity 继承 AppCompat 主题才能正确使用此库。

  1. 关闭对话框:Dismissing Dialog

build():创建对话框
show():显示对话框
dismiss():关闭对话框
类似 AlertDialog 的,有以下两种方式获得MaterialDialog 的实例并显示它。

方式一:

MaterialDialog dialog = new MaterialDialog.Builder(this)
              .title(R.string.title)// 标题
              .content(R.string.content)// 内容
              .positiveText(R.string.agree)
              .show();// 显示对话框

方式二:

MaterialDialog.Builder builder = new MaterialDialog.Builder(this)
              .title(R.string.title)// 标题
              .content(R.string.content)// 内容
              .positiveText(R.string.agree);
MaterialDialog dialog = builder.build();// 创建对话框
dialog.show();// 显示对话框
  1. 显示一个图标:Dismissing Dialogs

图标显示在标题的左侧。

new MaterialDialog.Builder(this)
              .title(R.string.title)// 标题
              .content(R.string.content)// 内容
              .positiveText(R.string.agree)
              .icon(R.drawable.icon) // 标题左侧的图标
              .show();// 显示对话框

还可以使用 limitIconToDefaultSize()、maxIconSize(int size)、maxIconSizeRes(int sizeRes) 这些方法来限制图标的最大大小。

  1. 叠放行动按钮:Stacked Action Buttons

如果你有多个操作按钮一起太宽而无法放在一行上,对话框会将这些按钮叠放在垂直方向。
叠放行为在 Builder 中定义,一共有三种叠放行为,分别是

  • StackingBehavior.ALWAYS:总是垂直叠放
  • StackingBehavior.ADAPTIVE:自适应,如果他们需要适合的对话框,则动作按钮将垂直叠放
  • StackingBehavior.NEVER:从不叠放
new MaterialDialog.Builder(this)
              .title(R.string.title)// 标题
              .content(R.string.content)// 内容
              .positiveText(R.string.long_positive)
              .negativeText(R.string.negative)
              .stackingBehavior(StackingBehavior.ADAPTIVE) // 默认值:自适应
              .show();// 显示对话框
  1. 中性行动按钮:Neutral Action Button

除了正面和负面文本之外,还可以指定中性文本,它会显示最左边的中立动作。

new MaterialDialog.Builder(this)
                .title("设备列表")// 标题
                .content("content")// 内容
                .positiveText(R.string.long_positive)
                .negativeText(R.string.negative)
                .neutralText(R.string.more_info)
                .show();// 显示对话框
  1. 回调:Callbacks

从版本 0.8.2.0 开始,callback() Builder 方法已被弃用,以支持下面讨论的各个回调方法。 早期版本仍然需要使用 ButtonCallback。

new MaterialDialog.Builder(this)
    .onPositive(new MaterialDialog.SingleButtonCallback() 
        @Override
        public void onClick(MaterialDialog dialog, DialogAction which) 
            // TODO
        
    )
    .onNeutral(new MaterialDialog.SingleButtonCallback() 
        @Override
        public void onClick(MaterialDialog dialog, DialogAction which) 
            // TODO
        
    )
    .onNegative(new MaterialDialog.SingleButtonCallback() 
        @Override
        public void onClick(MaterialDialog dialog, DialogAction which) 
            // TODO
        
    )
    .onAny(new MaterialDialog.SingleButtonCallback() // 此方法可以监听所有三个动作按钮
        @Override
        public void onClick(MaterialDialog dialog, DialogAction which) 
            if (DialogAction.POSITIVE == which) 
                            // TODO:
             else if (DialogAction.NEGATIVE == which) 
                            // TODO:
             else if (DialogAction.NEUTRAL == which) 
                            // TODO:
            
        
    );

注意:如果 autoDismiss 关闭,则必须在这些回调中手动关闭对话框。自动关闭默认开启。

  1. 复选框提示:CheckBox Prompts

复选框提示可以显示类似于 android 用来请求 API 23+ 权限的 UI。
注意:也可以在列表对话框和输入对话框中使用复选框提示。

new MaterialDialog.Builder(this)
                .iconRes(R.drawable.ic_default_icon)// 标题左侧的图标
                .limitIconToDefaultSize()// 标题左侧图标的最大值
                .title("title6")// 标题
                .positiveText("Allow")
                .negativeText("Deny")
                .onAny(new MaterialDialog.SingleButtonCallback() 
                    @Override
                    public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) 
                        Toast.makeText(TestActivity.this, "Prompt checked ? " + dialog.isPromptCheckBoxChecked(),
                                Toast.LENGTH_SHORT).show();
                    
                )
                .checkBoxPromptRes(R.string.app_name, false, null)
                .show();// 显示对话框
  1. 列表对话框:List Dialogs
String[] items = "A", "BB", "CCC", "DDDD", "EEEEE";
new MaterialDialog.Builder(this)
                .title("title7")// 标题
                .items(items)// 列表数据
                .itemsCallback(new MaterialDialog.ListCallback() 
                    @Override
                    public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) 
                        Toast.makeText(TestActivity.this, "position = " + position + " , text = " + text, Toast.LENGTH_SHORT).show();
                    
                )
                .show();// 显示对话框

注意:如果 autoDismiss 关闭,则必须手动关闭回调中的对话框,自动关闭默认开启。你可以将 positiveText() 或其他操作按钮传递给构建器以强制它显示列表下方的操作按钮,但是这仅在某些特定情况下有用。

  1. 单选列表对话框:Single Choice List Dialogs

单选列表对话框与常规列表对话框几乎相同,唯一的区别是使用 itemsCallbackSingleChoice 设置回调而不是 itemsCallback,这表示对话框显示列表项旁边的单选按钮。

String[] items = "A", "BB", "CCC", "DDDD", "EEEEE";
new MaterialDialog.Builder(this)
                .title("title8")// 标题
                .items(items)// 列表数据
                // itemsCallbackSingleChoice 方法中的第一个参数代表预选项的索引值,没有预选项这个值就设置为 -1,有预选项就传入一个预选项的索引值即可。
                // 如果不使用自定义适配器,则可以使用 MaterialDialog 实例上的 setSelectedIndex(int) 更新选定的索引值。
                .itemsCallbackSingleChoice(1, new MaterialDialog.ListCallbackSingleChoice() 
                    @Override
                    public boolean onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) 
                        // 如果使用 alwaysCallSingleChoiceCallback() 方法,在这边返回 false 将不允许新选择的单选按钮被选中。
                        return true;
                    
                )
                // 如果没有使用 positiveText() 设置正面操作按钮,则当用户按下正面操作按钮时,
                // 对话框将自动调用单一选择回调方法,该对话框也将自行关闭,除非关闭自动关闭。
                .positiveText("Choose")
                // 如果调用 alwaysCallSingleChoiceCallback() 该方法,则每次用户选择/取消项目时都会调用单选回调方法。
                .alwaysCallSingleChoiceCallback()
                .show();// 显示对话框
  1. 颜色单选按钮:Coloring Radio Buttons

像“动作”按钮和“材质”对话框中的许多其他元素一样,您可以自定义对话框单选按钮的颜色。 Builder类包含一个widgetColor(),widgetColorRes(),widgetColorAttr()和choiceWidgetColor()方法。 他们的名字和参数注释使他们自我解释。
widgetColor是影响其他UI元素的相同颜色。 choiceWidgetColor特定于单个和多个选择对话框,它仅影响单选按钮和复选框。 您提供了一个ColorStateList,而不是用于生成ColorStateList的单一颜色。
请注意,默认情况下,单选按钮将使用ColorAccent(用于AppCompat)或android:colorAccent(用于Material主题)中的颜色在活动主题中着色。
本自述文件的全局主题部分中还有一个全局主题属性:md_widget_color。

  1. 多选列表对话框:Multi Choice List Dialogs

多选列表对话框与常规列表对话框几乎相同,唯一的区别是使用 itemsCallbackMultiChoice 设置回调而不是 itemsCallback,这表示对话框显示列表项旁边的复选框,并且回调可以返回多个选择。

String[] items = "A", "BB", "CCC", "DDDD", "EEEEE";
new MaterialDialog.Builder(this)
                .title("title")// 标题
                .items(items)// 列表数据
                // itemsCallbackMultiChoice 方法中的第一个参数代表预选项的值,没有预选项这个值就设置为 null,有预选项就传入一组预选项的索引值即可。
                .itemsCallbackMultiChoice(null, new MaterialDialog.ListCallbackMultiChoice() 
                    @Override
                    public boolean onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text) 
                        // 如果使用 alwaysCallMultiChoiceCallback() 方法,在这边返回 false 将不允许新选择的单选按钮被选中。
                        return true;
                    
                )
                // 如果没有使用 positiveText() 设置正面操作按钮,则当用户按下正面操作按钮时,
                // 对话框将自动调用多项选择回调方法,该对话框也将自行关闭,除非关闭自动关闭。
                .positiveText("Choose")
                // 如果调用 alwaysCallMultiChoiceCallback() 该方法,则每次用户选择/取消项目时都会调用多项选择回调方法。
                .alwaysCallMultiChoiceCallback()
                .show();// 显示对话框
  1. 颜色复选框:Coloring Check Boxes

像“动作”按钮和“材质”对话框中的许多其他元素一样,您可以自定义对话框复选框的颜色。 Builder类包含一个widgetColor(),widgetColorRes(),widgetColorAttr()和choiceWidgetColor()方法。 他们的名字和参数注释使他们自我解释。
widgetColor是影响其他UI元素的相同颜色。 choiceWidgetColor特定于单个和多个选择对话框,它仅影响单选按钮和复选框。 您提供了一个ColorStateList,而不是用于生成ColorStateList的单一颜色。
请注意,默认情况下,单选按钮将使用ColorAccent(用于AppCompat)或android:colorAccent(用于Material主题)中的颜色在活动主题中着色。
本自述文件的全局主题部分中还有一个全局主题属性:md_widget_color。

  1. 为列表项目视图分配标识

如果需要通过 ID 而不是索引来跟踪列表项目,则可以从整数数组中分配项目 ID,还可以传递一个文字整数数组(int [])来代替数组资源 ID。

String[] items = "A", "BB", "CCC", "DDDD", "EEEEE";
int[] ids = 0, 1, 2, 3, 4;
new MaterialDialog.Builder(this)
                .title("title")// 标题
                .items(items)// 列表数据
                .itemsIds(ids)// 列表 ID
                .itemsCallback(new MaterialDialog.ListCallback() 
                    @Override
                    public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) 
                        Toast.makeText(TestActivity.this, "position = " + position + " , text = " + text
                                + " , ID = " + itemView.getId(), Toast.LENGTH_SHORT).show();
                    
                )
                .show();// 显示对话框
  1. 自定义列表对话框:Custom List Dialogs

与 Android 的对话框类似,你可以通过 .adapter() 传递自己的适配器来自定义列表的工作方式。

String[] items = "A", "BB", "CCC", "DDDD", "EEEEE";
new MaterialDialog.Builder(this)
                .title("title")// 标题
                // adapter 方法中第一个参数表示自定义适配器,该适配器必须继承 RecyclerView.Adapter
                // 第二个参数表示布局管理器,如果不需要设置就为 null,可选择的值只有线性布局管理器(LinearLayoutManager)
                // 和网格布局管理器(GridLayoutManager)两种
                .adapter(new ButtonItemAdapter(this, items), null)
                .show();// 显示对话框
 /**
     * 自定义适配器
     */
    private class ButtonItemAdapter extends RecyclerView.Adapter 

        private Context mContext;
        private String[] items = null;

        ButtonItemAdapter(Context mContext, String[] items) 
            this.mContext = mContext;
            this.items = items;
        

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
            // TODO
            return null;
        

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
            // TODO
        

        @Override
        public int getItemCount() 
            return items.length;
        
    

注意:对于较新的版本,MaterialDialog 不再支持 ListView 和 ListAdapter,都改成使用 RecycleView了。还有自定义适配器中必须要自行处理项目的点击事件。

MaterialDialog dialog = new MaterialDialog.Builder(this)
                 ...
                .build();
RecyclerView list = dialog.getRecyclerView();
// Do something with it.
dialog.show();
  1. 自定义视图:Custom Views
boolean wrapInScrollView = true;
new MaterialDialog.Builder(this)
                .title("title")// 标题
                // 自定义视图,参数一表示自定义视图的布局,参数二表示是否将自定义视图放置在 ScrollView 中,
                // 这允许用户根据需要滚动自定义视图(小屏幕、长内容等)。但是,有些情况下不需要使用这种行为,
                // 这些情况主要包括在自定义布局中包含 ScrollView、ListViews、RecycleViews、WebViews、GridViews 等
                // wrapInScrollView 该值为 true 时,自定义视图会自动填充它。
                .customView(R.layout.activity_login, wrapInScrollView)
                .positiveText("Positive")
                .show();// 显示对话框
  1. 以后访问:Later Access

如果需要在构建对话框后访问自定义视图中的视图,则可以使用 MaterialDialog 的 getCustomView() 获得自定义视图的对象。如果将布局资源传给 Builder,则对话框会处理布局的初始化工作。

MaterialDialog dialog = // ... initialization via the builder ...
View view = dialog.getCustomView();// 获取对话框中的自定义视图对象
  1. 字体:Typefaces
new MaterialDialog.Builder(this)
                .title("title")// 标题
                .content("content")// 内容
                .typeface("Roboto.ttf", "Roboto-Light.ttf")// 字体
                .show();// 显示对话框

修改字体调用 Builder 中的 .typeface(String, String) 方法即可,其中字体时从 assets/font 中提取的。这个方法还将通过 TypefaceHelper 处理循环字体,可以在自己的项目中使用该字体以避免重复分配。原始字体变量不会被回收,每次调用都会再次分配该字体。还有一个全局主题属性可用于自动将字体应用于应用程序中的每一个 MaterialDialog 中。

  1. 获取和设置操作按钮:Getting and Setting Action Buttons

获取对话框的操作按钮:

MaterialDialog dialog = // ... initialization via the builder ...
View positive = dialog.getActionButton(DialogAction.POSITIVE);
View negative = dialog.getActionButton(DialogAction.NEGATIVE);
View neutral = dialog.getActionButton(DialogAction.NEUTRAL);

更新对话框操作按钮的标题:

MaterialDialog dialog = // ... initialization via the builder ...
dialog.setActionButton(DialogAction.NEGATIVE, "New Title");
  1. 主题化:Theming

在 Lollipop 之前,如果不使用反射和自定义绘图,主题化 AlertDialogs 基本上是不可能的,自从 KitKat 之后,Android 变得更加色彩中性,但 AlertDialogs 继续使用 Holo Blue 作为标题和标题分隔符,除了动作按钮,Lollipop 还有更多的改进,默认对话框中没有颜色,但是 MaterialDialog 使得主题化更容易。

  1. 基本:Basics

默认情况下,MaterialDialog 将基于从创建对话框的上下文中检索 ?android:textColorPrimary 属性中应用浅色主题或深色主题。也可以使用全局主题属性来设置。

new MaterialDialog.Builder(this)
                .title("title")// 标题
                .content("content")// 内容
                .theme(Theme.DARK)// 主题
                .show();// 显示对话框
  1. 颜色:Colors

使用该项目创建的对话框几乎所有方面都可以被着色。

new MaterialDialog.Builder(this)
                .title("title")// 标题
                .titleColorRes(R.color.pager_title_1)// 标题颜色
                .content("content")// 内容
                .contentColor(Color.BLUE)// 内容颜色
                .linkColorAttr(R.attr.civ_fill_color)
                .dividerColorRes(R.color.pager_title_2)// 分割线颜色
                .backgroundColorRes(R.color.interact_color_press)// 背景颜色
                .positiveText("Positive")
                .positiveColorRes(R.color.pager_title_1)
                .negativeText("Negative")
                .negativeColorRes(R.color.pager_title_2)
                .neutralText("Neutral")
                .neutralColorRes(R.color.pager_title_3)
                .widgetColorRes(R.color.pager_title_1)// 适用于进度条、复选框和单选按钮
                .buttonRippleColorRes(R.color.pager_title_2)
                .show();

注意:这些方法中的每一种都有三种方法可以直接设置颜色,分别是:

  • .xxxColor(int color)
  • .xxxColorAttr(int colorAttr)
  • .xxxColorRes(int colorRes)
  1. 选择器:Selectors

选择器是可以在按下或放开时改变状态的绘图。

new MaterialDialog.Builder(this)
                // 设置所有操作按钮的选择器
                .btnSelector(R.drawable.custom_btn_selector)
                // 仅设置 Positive 这个操作按钮的选择器,这样使得 Positive 这个操作按钮与其他操作按钮有不同的选择器
                .btnSelector(R.drawable.custom_btn_selector_primary, DialogAction.POSITIVE)
                // 设置当按钮叠放时使用的选择器,可能是因为没有足够的控件将它们全部放在一行上,或者在 Builder 上使用 forceStacked(true)
                .btnSelectorStacked(R.drawable.custom_btn_selector_stacked)
                // 在不使用自定义适配器时,listSelector 用于列表项目的选择器
                .listSelector(R.drawable.custom_list_stackedbtn_selector)
                .show();// 显示对话框

注意:与使用自定义操作按钮选择器相关的重要说明:确保你的选择器可绘制的引用插入可绘制图像就像默认的那样——这对于正确的动作按钮填充很重要。

  1. 位置:Gravity
new MaterialDialog.Builder(this)
                .title("title")// 标题
                .titleGravity(GravityEnum.CENTER)// 标题的位置
                .content("content")// 内容
                .contentGravity(GravityEnum.CENTER)// 内容的位置
                .positiveText("Positive")
                .negativeText("Negative")
                .neutralText("Neutral")
                .btnStackedGravity(GravityEnum.END)// 操作按钮的位置
                .itemsGravity(GravityEnum.END)// 当你不使用适配器时,列表项的位置
                .buttonsGravity(GravityEnum.END)
                .show();// 显示对话框

对于 buttonsGravity 的位置表示如下所示:

START(Default)NeutralNegativePositive
CENTERNegativeNeutralPositive
ENDPositiveNegativeNeutral

注意:如果没有 Positive 按钮,就用 Negative 代替,除了 CENTER。

  1. Material 调色版

http://www.google.com/design/spec/style/color.html#color-color-palette

  1. 全局主题
<style name="MyAppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- 所有对话框默认主题为 Theme.Dark,并将其设置为 true -->
        <item name="md_dark_theme">true</item>
        <!-- 这个属性将覆盖暗色或浅色对话框的背景色,注意:如果在此处使用深色,应该将 md_dark_theme 设置为 true,这样文本和选择器才能可见 -->
        <item name="md_background_color">#37474F</item>
        <!-- 在所有对话框的标题旁边添加一个图标 -->
        <item name="md_icon">@mipmap/ic_launcher</item>
        <!-- 设置图标的最大尺寸 -->
        <attr name="md_icon_max_size" format="dimension" />
        <!-- 将图标设置为默认最大大小(48dp) -->
        <attr name="md_icon_limit_cion_to_default_size" format="boolean" />
        <!-- 默认情况下,标题文本的颜色是从系统属性 ?android:textColorPrimary 得来的 -->
        <item name="md_title_color">#E91E63</item>
        <!-- 默认情况下,内容文本的颜色是从系统属性 ?android:textColorSecondary 得来的 -->
        <item name="md_content_color">#9C27B0</item>
        <!-- 默认情况下,链接文本的颜色是 AppCompat 的 colorAccent 属性或者 Material 主题的 android:colorAccent 属性得来的 -->
        <item name="md_link_color">#673AB7</item>
        <!-- 默认情况下,positive 文本的颜色是 AppCompat 的 colorAccent 属性或者 Material 主题的 android:colorAccent 属性得来的 -->
        <item name="md_positive_color">#673AB7</item>
        <!-- 默认情况下,neutral 文本的颜色是 AppCompat 的 colorAccent 属性或者 Material 主题的 android:colorAccent 属性得来的 -->
        <item name="md_neutral_color">#673AB7</item>
        <!-- 默认情况下,negative 文本的颜色是 AppCompat 的 colorAccent 属性或者 Material 主题的 android:colorAccent 属性得来的 -->
        <item name="md_negative_color">#673AB7</item>
        <!-- 默认情况下,进度条、复选框和单选按钮的颜色是 AppCompat 的 colorAccent 属性或者 Material 主题的 android:colorAccent 属性得来的 -->
        <item name="md_widget_color">#673AB7</item>
        <!-- 默认情况下,列表 item 的文本颜色在亮主题下为黑色,在暗主题下为白色 -->
        <item name="md_item_color">#9C27B0</item>
        <!-- 这个属性将覆盖当使用顶部和底部分割线时的颜色,内容是可滚动的 -->
        <item name="md_divider_color">#E1E63</item>
        <!-- 这个属性将覆盖操作按钮上显示波纹的颜色(在 Lollipop 及以上版本),默认情况下 属性 colorControlHighlight 是来自 AppCompat 或者 Material 主题 -->
        <item name="md_btn_ripple_color">#E1E63</item>
        <!-- 这个属性将覆盖列表上使用的选择器 -->
        <item name="md_list_selector">@drawable/selector</item>
        <!-- 这个属性将覆盖操作按钮上使用的选择器 -->
        <item name="md_btn_stacked_selector">@drawable/selector</item>
        <!-- 这个属性将覆盖 positive 操作按钮上使用的背景选择器 -->
        <item name="md_btn_positive_selector">@drawable/selector</item>
        <!-- 这个属性将覆盖 neutral 操作按钮上使用的背景选择器 -->
        <item name="md_btn_neutral_selector">@drawable/selector</item>
        <!-- 这个属性将覆盖 negative 操作按钮上使用的背景选择器 -->
        <item name="md_btn_negative_selector">@drawable/selector</item>
        <!-- 设置对话框标题文字的位置,默认为 start,可以是 start、center 和 end -->
        <item name="md_title_gravity">start</item>
        <!-- 设置对话框内容文字的位置,默认为 start,可以是 start、center 和 end -->
        <item name="md_content_gravity">start</item>
        <!-- 设置对话框列表项文字的位置(不包括自定义适配器),默认为 start,可以是 start、center 和 end -->
        <item name="md_items_gravity">start</item>
        <!-- 设置对话框操作按钮文字的位置,默认为 start,
         start:Neutral Negative Positive
         center:Negative Neutral Positive
         end:Positive Negative Neutral -->
        <item name="md_buttons_gravity">start</item>
        <!-- 设置对话框操作按钮叠放文字的位置,默认为 end,可以是 start、center 和 end -->
        <item name="md_btnstacked_gravity">end</item>
        <!-- 设置标题和操作按钮的字体(默认为 null) -->
        <item name="md_medium_font">Roboto-Medium.ttf</item>
        <!-- 设置其他地方的字体(默认为 null),比如内容和列表项等 -->
        <item name="md_regular_font">Roboto-Regular.ttf</item>
    </style>
  1. 显示、取消和关闭的回调:Show、Cancel and Dismiss Callbacks
new MaterialDialog.Builder(this)
                .title("Use Google's Location Services?")// 标题
                .content("Let Google help apps determine location. This means sending " +
                        "anonymous location data to Google, even when no apps are running.")// 内容
                .positiveText("Agree")
                .showListener(new DialogInterface.OnShowListener() // 设置显示监听器
                    @Override
                    public void onShow(DialogInterface dialogInterface) 
                        Toast.makeText(TestActivity.this, "showListener", Toast.LENGTH_SHORT).show();
                    
                )
                .cancelListener(new DialogInterface.OnCancelListener() // 设置取消监听器
                    @Override
                    public void onCancel(DialogInterface dialogInterface) 
                        Toast.makeText(TestActivity.this, "cancelListener", Toast.LENGTH_SHORT).show();
                    
                )
                .dismissListener(new DialogInterface.OnDismissListener() // 关闭对话框监听器
                    @Override
                    public void onDismiss(DialogInterface dialogInterface) 
                        Toast.makeText(TestActivity.this, "dismissListener", Toast.LENGTH_SHORT).show();
                    
                )
                // 在对话框之外禁用关闭对话框的功能,默认为 true 表示在对话框之外点击就关闭对话框,
                // 反之,该值为 false 时表示在对话框之外点击就禁用关闭对话框的功能
                .cancelable(true)
                .show();// 显示对话框
  1. 输入对话框:Input Dialogs
new MaterialDialog.Builder(this)
                .title("Input")// 标题
                .content("input content")// 内容
                .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)// 输入类型
                .input("input hint", "input prefill", new MaterialDialog.InputCallback() 
                    @Override
                    public void onInput(@NonNull MaterialDialog dialog, CharSequence input) 
                        Toast.makeText(TestActivity.this, "do something...", Toast.LENGTH_SHORT).show();
                    
                )
                .show();// 显示对话框

输入对话框会自动处理对 EditText 的对焦饼显示键盘以允许用户立即输入,当对话框关闭时,键盘将被自动解除。
注意:当按下输入提交给回调时,该对话框将强制显示 positive 操作按钮,另外,输入类型是可选项,不一定非要设置。

  1. 带颜色的 EditText:Coloring the EditText

可自定义输入对话框中 EditText 的颜色,使用方法:widgetColor()、widgetColorRes()、widgetColorAttr()
注意:默认情况下,EditText 将使用 AppCompat 中的 colorAccent 属性或者 Material 主题中的 android:colorAccent 属性。
全局属性:md_widget_color。

  1. 限制输入长度:Limiting Input Length
new MaterialDialog.Builder(this)
                .title("Input")// 标题
                .inputRangeRes(2, 20, R.color.pager_title_3)// 限制输入范围
                .input(null, null, new MaterialDialog.InputCallback() 
                            @Override
                            public void onInput(@NonNull MaterialDialog dialog, CharSequence input) 
                                Toast.makeText(TestActivity.this, "Do something...", Toast.LENGTH_SHORT).show();
                            
                        
                )
                .show();// 显示对话框
  1. 自定义失效:Custom Invalidation

启用或禁用 EditText 的最简单方法是从 Builder 中调用 alwaysCallInputCallback() 方法,以便当用户更改输入时调用回调函数,这个方法可以不断检查输入的内容,如果决定不能提交,可以在回调中使用它来禁用提交按钮:

dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false);
  1. 进度条对话框:Progress Dialogs

(1)不确定进度条对话框:

new MaterialDialog.Builder(this)
                .title("progress dialog")// 标题
                .content("please wait")// 内容
                .progress(true, 0)// 不确定进度条
                .show();// 显示对话框

(2)确定进度条对话框(Seek Bar):

MaterialDialog dialog = new MaterialDialog.Builder(this)
                .title("progress dialog")// 标题
                .content("please wait")// 内容
                // 第一个参数表示是否是不确定的,该值为 true 表示是不确定进度条,反之为确定进度条
                // 第二个参数表示进度条的最大值
                // 第三个参数表示是否显示百分比,如果该值为 true 表示显示百分比,反之不显示百分比
                .progress(false, 150, true)// 确定进度条
                .show();// 显示对话框
        while (dialog.getCurrentProgress() != dialog.getMaxProgress()) 
            if (dialog.isCancelled()) 
                break;
            
            try 
                Thread.sleep(50);
             catch (InterruptedException e) 
                e.printStackTrace();
            
            dialog.incrementProgress(1);
        
        dialog.setContent("Done");
  1. 水平进度指示器的不确定进度条:Make an Indeterminate Dialog Horizontal
    默认情况下,不确定进度条对话框将使用循环指示器,也可以用下面方法改为使用水平进度指示器。
new MaterialDialog.Builder(this)
                .title("progress dialog")// 标题
                .content("please wait")// 内容
                .progress(true, 0)// 不确定进度条
                .progressIndeterminateStyle(true)
                .show();// 显示进度条
  1. 为进度条着色:Coloring the Progress Bar

可自定义输入对话框中进度条的颜色,使用方法:widgetColor()、widgetColorRes()、widgetColorAttr()
注意:默认情况下,进度条将使用 AppCompat 中的 colorAccent 属性或者 Material 主题中的 android:colorAccent 属性。
全局属性:md_widget_color。

  1. 自定义编号和进度格式:Custom Number and Progress Formats
new MaterialDialog.Builder(this)
                .title("title")// 标题
                .content("content")// 内容
                .progress(false, 150, true)
                // 自定义编号
                .progressNumberFormat("01/50")
                // 自定义进度格式
                .progressPercentFormat(NumberFormat.getPercentInstance())
                .show();// 显示进度条
  1. 着色助手:Tint Helper

MDTintHelp:动态地为复选框、单选项、编辑框、进度条着色,

  1. 颜色选择器对话框:Color Choose Dialogs

~该部分是扩展功能,暂时未记录~

以上是关于MD 风格的 Dialog ---- MaterialDialog的主要内容,如果未能解决你的问题,请参考以下文章

关闭md-dialog后,将项目推送到数组

安卓 替换系统dialog风格后的通用提示框

安卓怎么修改系统“DIALOG”风格?

Angular-Material 、 AngularJS 、 TypeScript 、 Javascript 、 ng-controller 在我的 md-dialog 中无法访问

如何利用Activity的Dialog风格完成弹出框设计

安卓 dialog提示框工具包