DialogX优势
对话框是一个软件对用户操作进行响应、反馈的重要组件,而 DialogX 将可以协助开发者快速完成这些事务。
我们力求减少开发者所需要担心的,所需要顾虑的,而打造一款可以在任意时间,任意情况都能轻松使用的对话框组件。
在轻松使用的前提下,DialogX 提供了更多的个性接口方便开发者进行扩展,包括在对话框内插入自定义布局,亮暗色模式的切换,甚至自定义更符合 App UI 的自定义主题。
✅DialogX的特性:
1、DialogX 采用全新的实现方式,默认 View 实现方式更为轻便,亦可选 Window、DialogFragment 实现方式,自由灵活。
2、DialogX 的启动与线程无关,你可以在任意线程启动 DialogX 而它都将自动在 UI 线程运行。
3、DialogX 的启动无需 context 参数,默认提供静态方法一句代码实现对话框的启动,使用更加方便。
4、更自由,开发者可以轻松定制对话框中任何组件的样式,包括文本样式、按钮文字样式、菜单文本样式、输入文本样式,大到标题,小到提示消息都可以根据需要随意修改。
5、DialogX 采用主题分离设计,默认自带 Material 主题,可选引入 IOS、Kongzue、MIUI 等其他风格主题,大大减小 App 体积,同时提供了主题接口,如有定制需求完全可以自行实现一套私有主题。
6、更低的耦合度,更少的问题,DialogX 可以在对话框正在运行的过程中随意关闭 Activity ,而无需担心以往 AlertDialog 等组件会引发的 WindowLeaked 错误。
7、更流畅的体验,DialogX 的动画效果更加丰富,对话框启动动画采用非线性动画实现,更自带连贯的等待提示到完成错误动画过渡效果,让你的 APP 更具动感。
8、所有主题默认支持亮暗色两种模式,只需一键配置即可实现亮暗色的对话框主题切换,更有自由的布局内容满足定制化需求,DialogX 也支持自动适应系统亮暗色模式切换,能够根据系统设置自动判断亮暗色显示效果的切换。
9、轻松的实现对话框的生命周期管控以及沉浸式适配。
源码地址:https://github.com/kongzue/DialogX
使用
添加仓库
allprojects {
repositories {
google()
jcenter()
mavenCentral() //增加 mavenCentral 仓库
}
}
//或者这个,MavenCentral源是稳定版本,Jitpack 源会更新快速迭代测试版本
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' } //增加 jitPack Maven 仓库
}
}
添加依赖
//https://github.com/kongzue/DialogX对话框
def dialogX_version = "0.0.48"
implementation "com.github.kongzue.DialogX:DialogX:${dialogX_version}"
//样式
implementation "com.github.kongzue.DialogX:DialogXIOSStyle:${dialogX_version}"
implementation "com.github.kongzue.DialogX:DialogXKongzueStyle:${dialogX_version}"
implementation "com.github.kongzue.DialogX:DialogXMIUIStyle:${dialogX_version}"
//几个额外的扩展对话框,按需添加
def DialogXSample_version = "0.0.9"
//地址选择对话框
implementation "com.github.kongzue.DialogXSample:CityPicker:${DialogXSample_version}"
//日期选择对话框
implementation "com.github.kongzue.DialogXSample:DatePicker:${DialogXSample_version}"
//回复消息对话框
implementation "com.github.kongzue.DialogXSample:ReplyDialog:${DialogXSample_version}"
Application配置
//对话框配置
DialogX.init(this);
//设置主题样式,按需配置
DialogX.globalStyle= MaterialStyle.style();
DialogX.onlyOnePopTip = true;
DialogX.globalTheme= DialogX.THEME.LIGHT;
示例
基础对话框
输入对话框
底部菜单
简单消息提示,可当作Toast
阻断式提示
评论输入框
日期选择
半自定义对话框
全自定义对话框
还有很多,官方例子还有登录等弹出,还有多种样式可使用,非常不错,强烈推荐
这是我自己创建的一个对话框管理类,写的不好,欢迎提建议。
/**
* @author 饼子会飞
* @version 1.0 DialogX对话框的管理类,方便管理
* @data 2023/6/27 16:06
*/
public final class DialogManager {
private static volatile DialogManager instance;
/**
* @Author 饼子会飞
* @Description 私有化构造方法
* @Date 2023/8/5 16:34
**/
private DialogManager() {
}
/**
* @Author 饼子会飞
* @Description 双重检查锁单例实现
* @Date 2023/8/5 16:23
**/
public static DialogManager getInstance(){
if (instance==null){
synchronized (DialogManager.class){
if (instance==null){
instance=new DialogManager();
}
}
}
return instance;
}
/**
* @Author 饼子会飞
* @Description 对话框
* @Date 2023/8/5 16:15
**/
public MessageDialog msgDialog(String title,String message,String okText,String cancelText){
return new MessageDialog(title,message,okText,cancelText);
}
/**
* @Author 饼子会飞
* @Description 简单对话框
* @Date 2023/8/5 16:15
**/
public MessageDialog simpleMSGDialog(String title,String message){
return new MessageDialog(title,message,"确定","取消");
}
/**
* @Author 饼子会飞
* @Description 输入框对话框
* @Date 2023/8/5 16:15
**/
public InputDialog inputDialog(String title,String message,String okText,String cancelText){
return new InputDialog(title,message,okText,cancelText);
}
/**
* @Author 饼子会飞
* @Description 简单的输入框对话框
* @Date 2023/8/5 16:15
**/
public InputDialog simpleInputDialog(String title){
return new InputDialog(title,"","确定","取消");
}
private long mPressedTime = 0;
/**
* @Author 饼子会飞
* @Description 等待对话框
* @Date 2023/8/5 16:16
**/
public WaitDialog waitDialog(String title){
return WaitDialog.show(title).setOnBackPressedListener(new OnBackPressedListener<WaitDialog>() {
@Override
public boolean onBackPressed(WaitDialog dialog) {
tip(dialog);
return false;
}
});
}
private void tip(WaitDialog dialog){
long mNowTime = System.currentTimeMillis(); // 获取当前时间
if ((mNowTime - mPressedTime) > 2000) {
popTip("再按一次取消显示");
mPressedTime = mNowTime;
} else {
dialog.doDismiss(); // 关闭对话框
}
}
/**
* @Author 饼子会飞
* @Description 需要上下文的等待对话框
* @Date 2023/8/5 16:16
**/
public WaitDialog waitDialogContext(Activity activity, String title){
return WaitDialog.show(activity,title).setOnBackPressedListener(new OnBackPressedListener<WaitDialog>() {
@Override
public boolean onBackPressed(WaitDialog dialog) {
tip(dialog);
return false;
}
});
}
/**
* @Author 饼子会飞
* @Description 简单提示(等待对话框)
* @Date 2023/8/5 16:16
**/
public void tipDialog(String message, WaitDialog.TYPE tip){
TipDialog.show(message, tip);
}
/**
* @Author 饼子会飞
* @Description 成功提示后关闭页面
* @Date 2023/8/5 16:17
**/
public void succeedDialog(String message){
TipDialog.show(message, WaitDialog.TYPE.SUCCESS).setDialogLifecycleCallback(new DialogLifecycleCallback<WaitDialog>() {
@Override
public void onDismiss(WaitDialog dialog) {
super.onDismiss(dialog);
dialog.getOwnActivity().finish();
}
});
}
/**
* @Author 饼子会飞
* @Description 底部菜单
* @Date 2023/8/5 16:17
**/
public BottomMenu bottomMenu(String[] itemList){
BottomMenu bottomMenu=BottomMenu.build();
bottomMenu.setMenuList(itemList);
bottomMenu.setMenuTextInfo(new TextInfo().setGravity(Gravity.CENTER));
bottomMenu.setTitleTextInfo(new TextInfo().setGravity(Gravity.CENTER));
return bottomMenu;
}
/**
* @Author 饼子会飞
* @Description 底部菜单
* @Date 2023/8/5 16:17
**/
public BottomMenu bottomMenu(List<String> itemList){
BottomMenu bottomMenu=BottomMenu.build();
bottomMenu.setMenuStringList(itemList);
bottomMenu.setMenuTextInfo(new TextInfo().setGravity(Gravity.CENTER));
bottomMenu.setTitleTextInfo(new TextInfo().setGravity(Gravity.CENTER));
return bottomMenu;
}
/**
* @Author 饼子会飞
* @Description 简单的消息提示
* @Date 2023/8/5 16:17
**/
public PopTip popTip(String message){
return PopTip.show(message);
}
/**
* @Author 饼子会飞
* @Description 提示后关闭界面
* @Date 2023/8/5 16:17
**/
public PopTip haveFinishPopTip(String message){
return PopTip.show(message).setDialogLifecycleCallback(new BottomDialogSlideEventLifecycleCallback<PopTip>() {
@Override
public void onDismiss(PopTip dialog) {
super.onDismiss(dialog);
dialog.getOwnActivity().finish();
}
});
}
/**
* @Author 饼子会飞
* @Description 引导
* @Date 2023/8/5 16:17
**/
public GuideDialog guideDialog(){
return GuideDialog.build();
}
/**
* @Author 饼子会飞
* @Description 菜单
* @Date 2023/8/5 16:18
**/
public PopMenu popMenu(CharSequence[] menus){
return PopMenu.show(menus);
}
/**
* @Author 饼子会飞
* @Description 自定义对话框
* @Date 2023/8/5 16:18
**/
public CustomDialog customDialog(){
return CustomDialog.build();
}
/**
* @Author 饼子会飞
* @Description 评论对话框
* @Date 2023/8/5 16:18
**/
public ReplyDialog replyDialog(String title){
return ReplyDialog.build().setTitle(title).setReplyButtonText("发送");
}
/**
* @Author 饼子会飞
* @Description 日期选择
* @Date 2023/8/5 16:18
**/
public CalendarDialog calendarDialog(){
Date date=new Date(System.currentTimeMillis());
Calendar calendar=Calendar.getInstance();
calendar.setTime(date);
return CalendarDialog.build().setShowLunarCalendar(true)
.setDefaultSelect(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH)+1,calendar.get(Calendar.DAY_OF_MONTH));
}
/**
* @Author 饼子会飞
* @Description 日期选择
* @Date 2023/8/5 16:19
**/
public DatePickerDialog datePickerDialog(){
return DatePickerDialog.build();
}
/**
* @Author 饼子会飞
* @Description 地址选择
* @Date 2023/8/5 16:19
**/
public CityPickerDialog cityPickerDialog(){
return CityPickerDialog.build();
}
/**
* @Author 饼子会飞
* @Description xPopup的对话框
* @Date 2023/8/5 16:19
**/
public XPopup.Builder xPopup(Context context){
return new XPopup.Builder(context);
}
/**
* @Author 饼子会飞
* @Description 消息通知
* @Date 2023/8/5 16:22
**/
public PopNotification popNotification(String title,String message){
return PopNotification.show(title,message).showLong();
}
}
管理类封装了多种常用的对话框,简单食用,如有疑问,欢迎评论,具体使用,可参考https://github.com/kongzue/DialogX/wiki
管理类使用示例
DialogManager.getInstance().msgDialog("提示", "当前安装包已下载,是否安装或继续下载?",
"安装","继续下载")
.setOkButton(new OnDialogButtonClickListener<MessageDialog>() {
@Override
public boolean onClick(MessageDialog dialog, View v) {
install();
return false;
}
})
.setCancelButton(new OnDialogButtonClickListener<MessageDialog>() {
@Override
public boolean onClick(MessageDialog dialog, View v) {
downLoad(up_address);
return false;
}
}).show();