Skip to content

QMUIDialog

chanthuang edited this page Feb 25, 2019 · 7 revisions

QMUIDialog 提供了一系列常用的对话框,解决了系统默认对话框在不同 Android 版本上的表现不一致的问题。

QMUIDialog 一般使用 QMUIDialogBuilder 及其子类来创建。

基类 Builder 及其提供的通用方法

各种类型的 Builder 都应该继承 QMUIDialogBuilder,该类提供一些通用的方法。

方法名 描述
setTitle(String title) 设置对话框的标题
hasTitle() 返回对话框是否拥有标题
setCanceledOnTouchOutside(boolean canceledOnTouchOutside) 设置点击 Dialog 外部时是否关闭 Dialog
setOnDecorationListener(QMUIDialogView.OnDecorationListener onDecorationListener) 设置 Dialog 的 View 的 onDraw()dispatchDraw() 回调
addAction(QMUIDialogAction action) 添加按钮
addAction(CharSequence str, QMUIDialogAction.ActionListener listener) 添加按钮和点击事件
setActionContainerOrientation(int actionContainerOrientation) 设置按钮区域的排列方向(QMUIDialogBuilder.HORIZONTAL / QMUIDialogBuilder.VERTICAL)
setChangeAlphaForPressOrDisable(boolean changeAlphaForPressOrDisable) 设置点击按钮时、按钮不可点时是否要改变透明度
setActionDivider(int thickness, int colorRes, int startInset, int endInset) 设置按钮之前的分割线宽度、颜色、起始位置缩进、结束位置缩进
show() 生成一个 QMUIDialog,并显示出来
create() 生成一个 QMUIDialog,但不显示出来
create(int style) 根据 style 样式生成一个 QMUIDialog,但不显示出来
  • 自定义 Builder 时可继承的方法
方法名 描述
onConfigTitleView(TextView titleView) 对标题(TextView) 进行自定义修改,在标题 View 创建之后调用
onCreateContent(QMUIDialog dialog, ViewGroup parent, Context context) 创建标题以下、按钮以上部分的 View,并添加到 parent 中
onAfter(QMUIDialog dialog, LinearLayout parent, Context context) 对 Dialog 进行整体自定义修改,在 Dialog 的 View 创建完毕、未显示出来之前调用

对话框按钮

QMUIDialog 的按钮由 QMUIDialogAction 类负责构建,并可自定义样式。

方法名 描述
setOnClickListener(ActionListener onClickListener) 设置点击事件
setEnabled(boolean enabled) 设置是否可点击
buildActionView(QMUIDialog dialog, int index) 构造 QMUIButton 作为对话框按钮

常见的对话框类型

QMUI 提供了几种常见的对话框 Builder。

消息类型对话框

  • 类: QMUIDialog.MessageDialogBuilder

  • 主要方法

方法名 描述
setMessage(CharSequence message) 设置对话框的提示语
  • 使用示例:
new QMUIDialog.MessageDialogBuilder(getActivity())
    .setTitle("标题")
    .setMessage("确定要发送吗?")
    .addAction("取消", new QMUIDialogAction.ActionListener() {
        @Override
        public void onClick(QMUIDialog dialog, int index) {
            dialog.dismiss();
        }
    })
    .addAction("确定", new QMUIDialogAction.ActionListener() {
        @Override
        public void onClick(QMUIDialog dialog, int index) {
            dialog.dismiss();
        }
    })
    .show();

带 CheckBox 的消息确认框

  • 类: QMUIDialog.CheckBoxMessageDialogBuilder'

  • 主要方法

方法名 描述
setMessage(CharSequence message) 设置对话框的提示语
setChecked(boolean checked) 设置 CheckBox 勾选状态
isChecked() 获取 CheckBox 是否被勾选

使用示例:

new QMUIDialog.CheckBoxMessageDialogBuilder(getActivity())
    .setTitle("退出后是否删除账号信息?")
    .setMessage("删除账号信息")
    .setChecked(true)
    .addAction("取消", new QMUIDialogAction.ActionListener() {
        @Override
        public void onClick(QMUIDialog dialog, int index) {
            dialog.dismiss();
        }
    })
    .addAction("退出", new QMUIDialogAction.ActionListener() {
        @Override
        public void onClick(QMUIDialog dialog, int index) {
            dialog.dismiss();
        }
    })
    .show();

带输入框的对话框

  • 类: QMUIDialog.EditTextDialogBuilder'

  • 主要方法

方法名 描述
setPlaceholder(String placeholder) 设置输入框的 placeholder
setDefaultText(CharSequence defaultText) 设置输入框的默认文字
setInputType(int inputType) 设置 EditText 的 inputType

使用示例:

final QMUIDialog.EditTextDialogBuilder builder = new QMUIDialog.EditTextDialogBuilder(getActivity());
builder.setTitle("标题")
    .setPlaceholder("在此输入您的昵称")
    .setInputType(InputType.TYPE_CLASS_TEXT)
    .addAction("取消", new QMUIDialogAction.ActionListener() {
        @Override
        public void onClick(QMUIDialog dialog, int index) {
            dialog.dismiss();
        }
    })
    .addAction("确定", new QMUIDialogAction.ActionListener() {
        @Override
        public void onClick(QMUIDialog dialog, int index) {
            CharSequence text = builder.getEditText().getText();
            if (text != null && text.length() > 0) {
                Toast.makeText(getActivity(), "您的昵称: " + text, Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            } else {
                Toast.makeText(getActivity(), "请填入昵称", Toast.LENGTH_SHORT).show();
            }
        }
    })
    .show();

菜单类型的对话框

  • 类: QMUIDialog.MenuDialogBuilder'

  • 主要方法

方法名 描述
addItems(CharSequence[] items, OnClickListener listener) 添加多个菜单项和点击事件
addItem(CharSequence item, OnClickListener listener) 添加单个菜单项和点击事件

使用示例:

final String[] items = new String[]{"选项1", "选项2", "选项3"};
new QMUIDialog.MenuDialogBuilder(getActivity())
    .addItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(getActivity(), "你选择了 " + items[which], Toast.LENGTH_SHORT).show();
            dialog.dismiss();
        }
    })
    .show();

单选菜单类型的对话框

  • 类: QMUIDialog.CheckableDialogBuilder'

  • 主要方法

方法名 描述
addItems(CharSequence[] items, OnClickListener listener) 添加多个菜单项和点击事件
addItem(CharSequence item, OnClickListener listener) 添加单个菜单项和点击事件
setCheckedIndex(int checkedIndex) 设置选中的菜单项的下标
getCheckedIndex() 获取选中项的下标

使用示例:

final String[] items = new String[]{"选项1", "选项2", "选项3"};
final QMUIDialog.CheckableDialogBuilder builder = new QMUIDialog.CheckableDialogBuilder(getActivity());
builder.setTitle("请选择")
    .setCheckedIndex(1)
    .addItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            builder.setCheckedIndex(which);
        }
    })
    .addAction("确定", new QMUIDialogAction.ActionListener() {
        @Override
        public void onClick(QMUIDialog dialog, int index) {
            Toast.makeText(getActivity(), "你选择了 " + items[builder.getCheckedIndex()], Toast.LENGTH_SHORT).show();
            dialog.dismiss();
        }
    })
    .show();

多选菜单类型的对话框

  • 类: QMUIDialog.MultiCheckableDialogBuilder'

  • 主要方法

方法名 描述
addItems(CharSequence[] items, OnClickListener listener) 添加多个菜单项和点击事件
addItem(CharSequence item, OnClickListener listener) 添加单个菜单项和点击事件
setCheckedItems(int checkedItems) 设置被选中的菜单项下标(用 int 二进制中为1的位来表示该选项被选中)
setCheckedItems(int[] checkedIndexes) 设置被选中的菜单项下标数组(用数组的每一位来表示被选中项的下标)
getCheckedItemRecord() 获取选中项的下标(用 int 二进制中为1的位来表示该选项被选中)
getCheckedItemIndexes() 获取选中项的下标数组(用数组的每一位来表示被选中项的下标)

使用示例:

final String[] items = new String[]{"选项1", "选项2", "选项3", "选项4", "选项5", "选项6"};
final QMUIDialog.MultiCheckableDialogBuilder builder = new QMUIDialog.MultiCheckableDialogBuilder(getActivity())
    .setCheckedItems(new int[]{1, 3})
    .addItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
        }
    });
builder.addAction("取消", new QMUIDialogAction.ActionListener() {
    @Override
    public void onClick(QMUIDialog dialog, int index) {
        dialog.dismiss();
    }
});
builder.addAction("提交", new QMUIDialogAction.ActionListener() {
    @Override
    public void onClick(QMUIDialog dialog, int index) {
        String result = "你选择了 ";
        for (int i = 0; i < builder.getCheckedItemIndexes().length; i++) {
            result += "" + builder.getCheckedItemIndexes()[i] + "; ";
        }
        Toast.makeText(getActivity(), result, Toast.LENGTH_SHORT).show();
        dialog.dismiss();
    }
});
builder.show();

自定义对话框

  • 类: QMUIDialog.CustomDialogBuilder

  • 主要方法

方法名 描述
setLayout(int layoutResId) 设置自定义 layout

全局配置 QMUIDialog 样式

通过在 App 的 theme 中覆盖样式属性可在全局范围内配置 QMUIDialog 的样式,如:

<!-- 在 App 的 theme 中添加 -->
<item name="qmui_dialog_bg">@drawable/your_dialog_bg</item>

支持的属性如下:

属性名 描述
qmui_dialog_min_width Dialog 最小宽度
qmui_dialog_max_width Dialog 最大宽度
qmui_dialog_bg Dialog 的背景 Drawable
qmui_dialog_radius Dialog 的圆角大小
qmui_dialog_margin_vertical Dialog 的上下最小间距
qmui_dialog_padding_horizontal Dialog 的左右内间距
qmui_dialog_background_dim_amount Dialog 的底层遮罩不透明度
qmui_dialog_wrapper_style Dialog 的容器 View 样式
qmui_dialog_title_style Dialog 的标题 View 样式
qmui_dialog_action_container_style Dialog 的按钮区域容器 View 样式
qmui_dialog_action_style Dialog 的按钮 View 样式
qmui_dialog_message_content_style MessageDialogBuilder 创建出的 Dialog 中的消息 View 的样式
qmui_dialog_edit_content_style EditTextDialogBuilder 创建出的 Dialog 中的输入框 View 的样式
qmui_dialog_menu_container_style MenuDialogBuilder 创建出的 Dialog 中的选项容器 View 的样式
qmui_dialog_menu_item_style MenuDialogBuilder 创建出的 Dialog 中的选项 View 的样式