空祖家的对话框工具
献给要求我们安卓照着苹果设计稿做开发的产品们(手动滑稽
本库即将停止新功能的更新,请尽快升级使用 DialogX 。
Kongzue DialogX 现已上传正式版本,请前往 查看。
空祖家的对话框2.0拥有提供最简单的调用方式以实现消息框、选择框、输入框、等待提示、警告提示、完成提示、错误提示等弹出样式。以下是目前包含的所有对话框样式预览图:
试用版可以前往 下载
本例中,包含DialogDemo(Dialog/app/)是对话框的演示项目源代码,以及Library库(Dialog/dialog/)是封装的空祖家对话框的源代码。
项目托管的Maven仓库在
本项目遵循Apache-2.0开源协议,具体可参考:
· Maven仓库或Gradle的引用方式
· 使用说明
· 关于v2组件包
· 关于模糊效果
· 使用方法
···· 调用消息对话框的方法
···· 调用选择对话框的方法
···· 调用输入对话框
···· 调用等待提示框
···· 调用完成提示框
···· 调用警告提示框
···· 调用错误提示框
···· 调用消息通知
···· 调用底部菜单
···· 气泡提示
· 自定义对话框
· 自定义布局
· 附加功能
· 模态化(序列化)
· 一些建议
· 开源协议
· 更新日志
Maven仓库:
com.kongzue.dialog
dialog
2.5.2
pom
Gradle: 在dependencies{}中添加引用:
implementation 'com.kongzue.dialog:dialog:2.5.2'部分 Material 组件需要依赖:
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'⚠现有 Android X 版本提供,具体请转至 Android X分支 查看。
此外,
若需要使用 v1 兼容库的老版本,可使用:
implementation 'com.kongzue.dialog:dialog:2.2.8' //警告:不再提供更新若需要降低包体积,可使用不带模糊的版本:
implementation 'com.kongzue.dialog:dialog:2.1.0' //警告:不再提供更新DialogSettings.style = STYLE_MATERIAL;Material 风格对应 DialogSettings.STYLE_MATERIAL,
Kongzue 风格对应 DialogSettings.STYLE_KONGZUE,
iOS 风格对应 DialogSettings.STYLE_IOS
需要注意的是风格设置仅针对对话框,提示框样式不会改变。
DialogSettings.tip_theme = THEME_LIGHT; //设置提示框主题为亮色主题
DialogSettings.dialog_theme = THEME_DARK; //设置对话框主题为暗色主题具体预览图如下:
从 2.0.4 版本开始,提供不需要悬浮窗权限,且可以跨域显示的通知功能,如下图所示:
从 2.1.0 版本开始,提供底部菜单,可以通过 com.kongzue.dialog.v2.BottomMenu 进行使用,如下图所示:
从 2.1.1 版本开始,iOS风格的对话框、提示框、底部菜单新增即时模糊效果:
从 2.2.3 版本开始,MessageDialog、SelectDialog、InputDialog和BottomMenu 支持自定义布局:
从 2.3.4 版本开始,提供气泡提示功能:
在空祖家的对话框组件中,依然保留了一代的组件库但不再推荐使用,这是为了保持兼容性,若强行使用您会看到相关类的名称上有删除线。
为了更有效率的开发,我们现在强烈推荐直接使用v2组件库,其包含的包地址为:com.kongzue.dialog.v2
从2.1.1版本起可使用即时模糊效果。
您可以通过以下属性设置开关:
DialogSettings.use_blur = true; //设置是否启用模糊如果需要启动,还需要在您的 app 的 build.gradle 中添加以下代码:
android {
...
defaultConfig {
...
renderscriptTargetApi 19
renderscriptSupportModeEnabled true
}
}模糊效果目前仅对当 DialogSettings.style = STYLE_IOS 时三种对话框、提示框、等待框以及底部菜单有效。
可以通过以下方法修改模糊透明度:
/*
* 决定等待框、提示框以及iOS风格的对话框的模糊背景透明度(50-255)
*/
DialogSettings.blur_alpha = 200;提示:所有对话框组件均提供相应的 build(...) 方法用于预先创建,如需要对对话框部分参数进行微调的,可使用 build(...) 方法先创建对话框,然后调用相应的方法进行属性设置,再使用 showDialog() 方法显示对话框。
MessageDialog.show(context, "消息提示框", "用于提示一些消息", "知道了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});或者可以采用快速调用方式:
MessageDialog.show(context, "欢迎", "欢迎使用Kongzue家的对话框,此案例提供常用的几种对话框样式。\n如有问题可以在https://github.com/kongzue/Dialog提交反馈");SelectDialog.show(context, "提示", "请做出你的选择", "确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "您点击了确定按钮", Toast.LENGTH_SHORT).show();
}
}, "取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "您点击了取消按钮", Toast.LENGTH_SHORT).show();
}
});或者可以采用快速调用方式:
SelectDialog.show(context, "提示", "请做出你的选择", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "您点击了确定按钮", Toast.LENGTH_SHORT).show();
}
});InputDialog.show(context, "设置昵称", "设置一个好听的名字吧", "确定", new InputDialogOkButtonClickListener() {
@Override
public void onClick(Dialog dialog, String inputText) {
Toast.makeText(context, "您输入了:" + inputText, Toast.LENGTH_SHORT).show();
}
}, "取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});或者可以采用快速调用方式:
InputDialog.show(context, "设置昵称", "设置一个好听的名字吧", new InputDialogOkButtonClickListener() {
@Override
public void onClick(Dialog dialog, String inputText) {
Toast.makeText(context, "您输入了:" + inputText, Toast.LENGTH_SHORT).show();
}
});从 2.3.6 版本起,对于输入文本长度限制和文本类型限制,可通过 setInputInfo(InputInfo) 方法进行设置:
…WaitDialog.show(context, "载入中...");从 2.3.8 版本起,等待提示框支持自定义布局,可通过以下代码调用:
View customView = LayoutInflater.from(me).inflate(R.layout.layout_custom, null);
WaitDialog.show(context, "载入中...", customView);要动态修改正在显示的文本,可以先使用 show(...) 方法获取 WaitDialog 对象,然后使用 setText(...) 修改正在显示的文本。
但请注意,设置自定义布局并不会隐藏提示文本信息。
TipDialog.show(context, "完成", TipDialog.SHOW_TIME_SHORT, TipDialog.TYPE_FINISH);TipDialog.show(context, "请输入密码", TipDialog.SHOW_TIME_SHORT, TipDialog.TYPE_WARNING);TipDialog.show(context, "禁止访问", TipDialog.SHOW_TIME_LONG, TipDialog.TYPE_ERROR);注意,此处使用的是来自com.kongzue.dialog.v2 的 Notification 类。
通知消息(v2.Notification)与提示框(v2.TipDialog)的主要区别是提示框会打断用的操作,而消息通知不会,消息通知适合于并发需要提醒用户是否处理消息的业务场景,而提示框适用于阻断用户操作,提醒用户当前发生的情况的业务场景。
Notification.show(context, id, iconResId, getString(R.string.app_name), "这是一条消息", Notification.SHOW_TIME_LONG, notifactionType)
.setOnNotificationClickListener(new Notification.OnNotificationClickListener() {
@Override
public void OnClick(int id) {
Toast.makeText(context,"点击了通知",SHOW_TIME_SHORT).show();
}
})
;其中,id为通知消息id,在用户点击该通知后,会在OnNotificationClickListener中进行回调。
| 字段 | 含义 | 是否必须 |
|---|---|---|
| context | 上下文索引 | 必须 |
| iconResId | 图标 | 可选 |
| title | 通知标题 | 可选 |
| message | 通知内容 | 必须 |
| colorType | 消息类型 | 必须 |
| OnNotificationClickListener | 下载监听器 | 可选 |
注意,此处的消息类型 colorType 目前仅对“Kongzue 风格”有效,且提供的风格有:
| 字段 | 含义 | 是否默认 |
|---|---|---|
| TYPE_NORMAL | 默认灰黑色 | 默认 |
| TYPE_FINISH | 绿色 | 可选 |
| TYPE_WARNING | 橙色 | 可选 |
| TYPE_ERROR | 红色 | 可选 |
在2.0.6版本后,若 colorType 不为上述设定值,则可以使用自选颜色值,可为 Color 类的返回值。
另外,可以采用快速调用方式:
Notification.show(context, 0, "", "这是一条消息", Notification.SHOW_TIME_SHORT, notifactionType);注意,此处使用的是来自com.kongzue.dialog.v2 的 BottomMenu 类。
List list = new ArrayList<>();
list.add("菜单1");
list.add("菜单2");
list.add("菜单3");
BottomMenu.show(context, list, new OnMenuItemClickListener() {
@Override
public void onClick(String text, int index) {
Toast.makeText(context,"菜单 " + text + " 被点击了",SHOW_TIME_SHORT).show();
}
},true);包含的参数如下:
| 字段 | 含义 | 是否必须 |
|---|---|---|
| activity | 必须继承自 AppCompatActivity | 必须 |
| list | 泛型为 String 的列表 | 必须 |
| OnMenuItemClickListener | 点击回调 | 可选 |
| isShowCancelButton | 是否显示“取消”按钮,注意,STYLE_MATERIAL 风格对此无效 | 可选 |
| cancelButtonCaption | 设置“取消”按钮的文字 | 可选 |
另外,本菜单暂时对夜间模式(THEME_DARK)不受影响,只提供Light Theme,但不排除接下来的版本对此更新。
使用 iOS 主题时,DialogSettings.ios_normal_button_color 会对菜单内容文字的颜色产生影响,其他主题不受此属性影响。
或可以使用快速调用:
List list = new ArrayList<>();
list.add("菜单1");
list.add("菜单2");
list.add("菜单3");
BottomMenu.show(context, list);为底部对话框添加标题:
BottomMenu.show(context, list).setTitle("这里是标题测试");从 2.3.4 版本起,新增气泡提示功能。
使用方法如下:
Pop.show(context, view, "这是一个提示", showWhere, colorType);view 为气泡提示需要跟随的布局,可选参数 showWhere 可选:
| 字段 | 含义 | 是否默认 |
|---|---|---|
| SHOW_UP | 在跟随布局上方显示 | 是 |
| SHOW_LEFT | 在跟随布局左侧显示 | 否 |
| SHOW_RIGHT | 在跟随布局右侧显示 | 否 |
| SHOW_DOWN | 在跟随布局下方显示 | 否 |
可选参数 colorType 控制气泡颜色,当其值为 COLOR_TYPE_NORMAL 时受 DialogSettings.tip_theme 设置影响,会显示暗色或亮色主题,另外可选:
| 字段 | 含义 | 是否默认 |
|---|---|---|
| COLOR_TYPE_NORMAL | 默认颜色,此时会受 DialogSettings.tip_theme 影响 | 是 |
| COLOR_TYPE_FINISH | 绿色 | 否 |
| COLOR_TYPE_WARNING | 橙色 | 否 |
| COLOR_TYPE_ERROR | 红色 | 否 |
其次可使用 setText(...) 方法对已经创建的气泡提示进行文字修改,范例如下:
pop.setText("至少填写6位,还差" + (6 - editPop.getText().toString().length()) + "位");可使用 setOnDismissListener(...) 方法对气泡消失事件进行监听:
pop.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
}
});可使用 dismiss(); 方法直接关闭已创建的气泡:
pop.dismiss();从 2.3.5 版本起,针对复杂特殊文本显示进行了适配:
从 2.3.9 版本起,支持自定义对话框的创建:
CustomDialog.show(context, R.layout.layout_custom_dialog, new CustomDialog.BindView() {
@Override
public void onBind(CustomDialog dialog, View rootView) {
//绑定布局
ImageView btnOk = rootView.findViewById(R.id.btn_ok);
//绑定事件
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Example:让对话框消失
dialog.doDismiss();
}
});
}
});CustomDialog 的创建方式支持通过 layout 资源 ID 或直接使用 View 创建,其也支持对话框的模态化以及生命周期管理。
需要在自定义的对话框中关闭 CustomDialog,您可以在全局接收 CustomDialog 的 show 或 build 返回的组件,并执行其 doDismiss() 方法:
private CustomDialog customDialog;
//...
customDialog = CustomDialog.show(me, R.layout.layout_custom_dialog, new CustomDialog.BindView() {
@Override
public void onBind(View rootView) {
ImageView btnOk = rootView.findViewById(R.id.btn_ok);
//...
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
customDialog.doDismiss();
}
});
}
});从 2.2.3 版本起支持 MessageDialog、SelectDialog、InputDialog和BottomMenu 的自定义布局。
由于调用逻辑顺序不同,在 type 为 STYLE_KONGZUE 和 STYLE_IOS 使用方法举例:
//初始化布局:
View customView = LayoutInflater.from(context).inflate(R.layout.layout_custom, null);
//启动对话框
MessageDialog.show(context, null, null, "知道了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setCustomView(customView);在 type 为 STYLE_MATERIAL 时,请先使用 build(...) 方法创建 Dialog,接着设置好自定义布局后再执行 showDialog() 方法,使用方法举例:
//初始化布局:
View customView = LayoutInflater.from(me).inflate(R.layout.layout_custom, null);
//启动对话框
MessageDialog.build(context, null, null, "知道了", new DialogInterface.OnClickLis
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setCustomView(customView)
.setCanCancel(true)
.showDialog();等待对话框的自定义布局请参考:调用等待提示框
在任何一种对话框中都可以使用.setCanCancel(boolean)来设置是否可以点击对话框以外的区域关闭对话框,提示类默认都是禁止的,选择、输入对话框默认也是禁止的,消息对话框默认是允许的。
使用方法可以参考以下代码:
WaitDialog.show(context, "载入中...").setCanCancel(true);在空祖家的对话框组件中,您可以使用监听器来监听对话框的生命周期,Demo如下:
WaitDialog.show(context, "载入中...").setCanCancel(true).setDialogLifeCycleListener(new DialogLifeCycleListener() {
@Override
public void onCreate(AlertDialog alertDialog) {
//此时对话框创建
}
@Override
public void onShow(AlertDialog alertDialog) {
//此时对话框显示
}
@Override
public void onDismiss() {
//此时对话框关闭
}
});另外提供一些定制属性:
…若需要对某个对话框、提示框等进行单独的文字样式设置,请通过相应对话框的 build 创建该对话框,在调用 showDialog() 方法前进行 setTextInfo():
MessageDialog.build(me, "标题", "内容", "知道了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setCanCancel(true)
.setTitleTextInfo(new TextInfo()
.setBold(true)
.setFontColor(Color.rgb(253, 130, 255))
.setFontSize(10)
)
.showDialog();额外的,若您需要自定义对话框的标题、内容、按钮,请使用相对应的方法进行设置:
.setTitleTextInfo(new TextInfo()) //设置标题文字样式
.setContentTextInfo(new TextInfo()) //设置内容文字样式
.setButtonTextInfo(new TextInfo()) //设置按钮文字样式
.setOkButtonTextInfo(new TextInfo()) //针对选择对话框、输入对话框的“确定”按钮进行文字样式单独设置,不设置则按照 ButtonTextInfo 的样式处理
.setTxtInfo(new TextInf暂无开放 Issues,或尚未同步最近议题。