Skip to content
Kongzue edited this page Sep 6, 2022 · 105 revisions

引入 DialogX

以下四种引入方式请任选其一。

方式一:Gradle 引入 jitPack 源

最新版本: Jitpack.io
  1. 在 project 的 build.gradle 文件中找到 allprojects{} 代码块添加以下代码:
allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' }      //增加 jitPack Maven 仓库
    }
}
  1. 在 app 的 build.gradle 文件中找到 dependencies{} 代码块,并在其中加入以下语句:
//请将 dialogx_version 的值替换为最新版本
def dialogx_version = "0.0.43"
implementation "com.github.kongzue.DialogX:DialogX:${dialogx_version}"

从 0.0.43.beta8 起,下调了最低 API 兼容版本至 19,但请注意低于 21 时,部分效果,例如底部对话框的图标染色无法使用。

配置 DialogX

请在使用 DialogX 前,首先需要进行配置。

一般建议在 Application 的实现类中的 onCreate 方法中进行配置:

//初始化
DialogX.init(this);

配置完毕后就可以显示对话框了。

模糊效果

要使用开启组件的实时模糊效果(例如IOS主题),还需在 app 的 build.gradle 文件中找到android{defaultConfig{...}}代码块,在其中添加配置:

renderscriptTargetApi 21
renderscriptSupportModeEnabled true   

额外配置

要进行额外设置,可参考如下代码:

//开启调试模式,在部分情况下会使用 Log 输出日志信息
DialogX.DEBUGMODE = true;

//设置主题样式
DialogX.globalStyle = MaterialStyle.style();

//设置亮色/暗色(在启动下一个对话框时生效)
DialogX.globalTheme = DialogX.THEME.LIGHT;

//设置对话框最大宽度(单位为像素)
DialogX.dialogMaxWidth = 1920;

//设置 InputDialog 自动弹出键盘
DialogX.autoShowInputKeyboard = true;

//限制 PopTip 一次只显示一个实例(关闭后可以同时弹出多个 PopTip)
DialogX.onlyOnePopTip = true;

//设置对话框默认按钮文本字体样式
DialogX.buttonTextInfo = (TextInfo);

//设置对话框默认确定按钮文字样式
DialogX.okButtonTextInfo = (TextInfo);

//设置对话框默认标题文字样式
DialogX.titleTextInfo = (TextInfo);

//设置对话框默认内容文字样式
DialogX.messageTextInfo = (TextInfo);

//设置默认 WaitDialog 和 TipDialog 文字样式
DialogX.tipTextInfo = (TextInfo);

//设置默认输入框文字样式
DialogX.inputInfo = (InputInfo);

//设置默认底部菜单、对话框的标题文字样式
DialogX.menuTitleInfo = (TextInfo);

//设置默认底部菜单文本样式
DialogX.menuTextInfo = (TextInfo);

//设置默认对话框背景颜色(值为ColorInt,为-1不生效)
DialogX.backgroundColor = Color.WHITE;

//设置默认对话框默认是否可以点击外围遮罩区域或返回键关闭,此开关不影响提示框(TipDialog)以及等待框(TipDialog)
DialogX.cancelable = true;

//设置默认提示框及等待框(WaitDialog、TipDialog)默认是否可以关闭
DialogX.cancelableTipDialog = false;

//设置默认取消按钮文本文字,影响 BottomDialog
DialogX.cancelButtonText = (String);

//设置默认 PopTip 文本样式
DialogX.popTextInfo = (TextInfo);

//设置全局 Dialog 生命周期监听器
DialogX.dialogLifeCycleListener = (DialogLifecycleCallback);

//设置 TipDialog 和 WaitDialog 明暗风格,不设置则默认根据 globalTheme 定义
DialogX.tipTheme = (THEME);

//默认 TipDialog 和 WaitDialog 背景颜色(值为 ColorInt,为-1不生效)
DialogX.tipBackgroundColor = (ColorInt)

/**
 * 重写 TipDialog 和 WaitDialog 进度动画颜色,
 * 注意此属性为覆盖性质,即设置此值将替换提示框原本的进度动画的颜色,包括亮暗色切换的颜色变化也将被替代
 * (值为 ColorInt,为-1不生效)
 */
DialogX.tipProgressColor = (ColorInt)

/**
 * 设置 BottomDialog 导航栏背景颜色
 */
DialogX.bottomDialogNavbarColor = Color.TRANSPARENT;

//是否自动在主线程执行
DialogX.autoRunOnUIThread = true;

主题样式(DialogX.globalStyle)默认只自带 Material.style() 一种,你也可以引入其他主题,DialogX 采用模块化设计,因此你需要额外引入主题包才可以使用。

在这里 查看其他主题 或者 查看如何自定义主题

亮暗色设置支持你指定 DialogX 显示为亮色效果还是暗色效果,值的含义如下:

属性 解释
LIGHT 强制亮色模式
DARK 强制暗色模式
AUTO 自动判断,根据设备亮暗色自动改变

请注意,当使用 AUTO 时,且对话框已经启动的情况下,若用户切换了系统主题,那么对话框可能发生重启现象(闪烁),但这不会丢失对话框的内容和数据,例如用户在 InputDialog 输入对话框中输入了一串文本,在对话框重启后,这段文本依然会显示在输入框里,若你设置了对话框自定义了布局,这些布局的状态也不会变化,但对话框的生命周期监听器可能重置,也就意味着你可能会额外收到一次 onDismiss 和 onShow 事件的触发。

单独针对组件生效的属性

尽管已经有全局的配置,但开发者依然可以单独针对某一个组件进行一些设置。

例如如果全局配置为禁止使用点击外部区域关闭对话框,而要 BottomDialog 例外,那么可以使用如下配置:

BottomDialog.overrideCancelable = BaseDialog.BOOLEAN.TRUE;

还可以针对组件的动画进行单独设置,例如:

BottomDialog.overrideEnterDuration = 100;    //入场动画时长为100毫秒
BottomDialog.overrideExitDuration = 100;     //出场动画时长为100毫秒
BottomDialog.overrideEnterAnimRes = R.anim.anim_dialogx_top_enter;  //入场动画资源
BottomDialog.overrideExitAnimRes = R.anim.anim_dialogx_top_exit;    //出场动画资源

这样的方法单独对某一个组件进行进出场动画的重写设置。注意这些方法不会影响全局其他组件,只是单独设置单一组件的动画效果。

优先级为:实例使用方法设置 > 组件override设置 > 全局设置。

另外 FullScreenDialog 只提供动画时长设置,不提供动画资源设置(此组件只允许上下进出场动画);

CustomDialog 额外拥有了 overrideMaskEnterAnimResoverrideMaskExitAnimRes,可以覆盖背景遮罩的动画效果,设置为 0 时取消动画。

此时,当前项目中,其他的对话框组件将依然遵循全局配置,而单独针对组件生效的属性的对话框则会以单独属性设置为主。

注意此配置要区别于针对单一对话框实例的属性设置,例如:

BottomDialog.build()
        ...
        .setCancelable(true)   
        .show();

备注

TextInfo 用于存储基础文本样式设置,其包含一系列属性和响应的 get/set 方法,例如方法解释如下:

属性 解释 默认值
fontSize 字号大小,值为-1时使用默认样式,单位:dp -1
gravity 对齐方式,值为-1时使用默认样式,取值可使用Gravity.CENTER等对齐方式 -1
fontColor 文字颜色,值为1时使用默认样式,取值可以用Color.rgb(r,g,b)等方式获取 1
bold 是否粗体 false

InputInfo 用于提供输入内容的自定义设置,其包含一系列属性和响应的 get/set 方法,例如方法解释如下:

属性 解释 默认值
MAX_LENGTH 最大长度,-1不生效 -1
inputType 自定义输入类型,类型详见 android.text.InputType
textInfo 默认字体样式 (TextInfo)
multipleLines 是否支持多行 false
selectAllText 默认选中所有文字(便于修改) false

混淆配置

-keep class com.kongzue.dialogx.** { *; }
-dontwarn com.kongzue.dialogx.**

# 额外的,建议将 android.view 也列入 keep 范围:
-keep class android.view.** { *; }

# 若启用模糊效果,请增加如下配置:
-dontwarn androidx.renderscript.**
-keep public class androidx.renderscript.** { *; }

队列对话框

某些场景下需要有“模态”对话框的需要,即,一次性创建多个对话框,组成队列,逐一显示,当上一个对话框关闭时自动启动下一个对话框,此时可以使用队列对话框来完成。

示例代码如下,在 DialogX.showDialogList(...) 中构建多个对话框,请注意这些对话框必须是没有启动的状态,使用 .build() 方法完成构建,以 “,” 分隔组成队列,即可自动启动。

DialogX.showDialogList(
        MessageDialog.build().setTitle("提示").setMessage("这是一组消息对话框队列").setOkButton("开始").setCancelButton("取消")
                .setCancelButton(new OnDialogButtonClickListener<MessageDialog>() {
                    @Override
                    public boolean onClick(MessageDialog dialog, View v) {
                        dialog.cleanDialogList();
                        return false;
                    }
                }),
        PopTip.build().setMessage("每个对话框会依次显示"),
        PopNotification.build().setTitle("通知提示").setMessage("直到上一个对话框消失"),
        InputDialog.build().setTitle("请注意").setMessage("你必须使用 .build() 方法构建,并保证不要自己执行 .show() 方法").setInputText("输入文字").setOkButton("知道了"),
        TipDialog.build().setMessageContent("准备结束...").setTipType(WaitDialog.TYPE.SUCCESS),
        BottomDialog.build().setTitle("结束").setMessage("下滑以结束旅程,祝你编码愉快!").setCustomView(new OnBindView<BottomDialog>(R.layout.layout_custom_dialog) {
            @Override
            public void onBind(BottomDialog dialog, View v) {
                ImageView btnOk;
                btnOk = v.findViewById(R.id.btn_ok);
                btnOk.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                                        dialog.dismiss();
                                    }
                });
            }
        })
);

使用过程中,随时可以使用 .cleanDialogList() 来停止接下来的队列对话框的显示。

实现模式(实验性)

Window 实现模式

DialogX 默认使用 View 实现模式,自适应生命周期,你也可以选择 Window 的实现方案(与 AlertDialog 类似),请注意,使用 Window 实现模式是实验性质的,且存在一定的风险和已知 bug,你可以使用以下方法启用 Window 实现模式:

DialogX.implIMPLMode= DialogX.IMPL_MODE.WINDOW;

此模式下,目前已知存在如下问题:

- CustomDialog无法使用TOP、BOTTOM模式,会出现对话框不显示问题;
- 部分引发内存泄漏问题;

这些问题暂未找到解决办法,如有建议可提交修改代码。

DialogFragment 实现方式

在最新的版本 0.0.41.beta4 中,提供了 DialogFragment 实现方式,使用以下方法启用 DialogFragment 实现:

DialogX.implIMPLMode= DialogX.IMPL_MODE.DIALOG_FRAGMENT;

此模式下目前尚未发现待处理的问题,但依然不建议在生产环境使用。

FloatingActivity 实现方式

类似于 Window,使用一个透明底的 Activity 作为对话框的底层承担显示,这样的做法可以再一定程度上从后台启动(PendingIntent)。

DialogX.implIMPLMode= DialogX.IMPL_MODE.FLOATING_ACTIVITY;

常见问题

如果你遇到了一些问题,或没有达到预期效果,请按照如下步骤尝试:

  1. DialogX 仓库主页面 下载 Demo程序 并尝试运行,如果在您的设备上表现不正常,请 提交 Issues,并说明设备型号及系统版本,如果在设备上表现正常,那么按照第 2 条排查。

  2. 查阅 常见问题 看您的问题是否已经有解释,并按照建议进行配置。

  3. 若上述方法都无法帮您解决问题,请 提交 Issues,说明问题原因及重现问题的方法,或者你可以加入群与我直接进行讨论:590498789

反馈 DialogX
Clone this wiki locally