Skip to content

从 DialogV3 迁移至 DialogX

Kongzue edited this page Sep 16, 2022 · 5 revisions

🔁从 DialogV3 迁移至 DialogX

DialogV3 和 DialogX 有什么区别?

DialogV3 是一款受广大开发者喜爱的对话框封装组件,本质上是基于 DialogFragment 的封装,默认自带 4 套主题,特别是其中自带的 iOS 风格主题也备受好评,在此基础上 DialogV3 保证了不会因为 Activity 优先于 Dialog 关闭而导致的 WindowLeaked 错误,但因为模态化的设计需要持有 Context 句柄和必须使用 AppCompatActivity 启动也存在一定的局限性,基于改善这个问题的目的,现已推出 DialogX 框架。

DialogX 框架实际上是 Kongzue 对话框组件的第四代产品,完全重构了整个框架代码,使用了全新的实现方式。DialogX 是不需要 Context 启动参数的,所有操作都会在初始化后自动进行,且它不再持有 Context 句柄避免了内存泄漏的问题。DialogX 还采用了主题分离的设计模式,大大减小了库的体积,使用只有在你需要时额外引入其他主题的设计,避免了增加冗余资源,这样的设计模式还带来了一个好处,就是完全自定义主题,现在你可以根据 APP 设计需要自行定制一套主题样式,更高的自由度和灵活性是 DialogX 设计的目标,那么已经使用 DialogV3 的产品该如何迁移至 DialogX 呢?

迁移至 DialogX 的优势

对话框是一个软件对用户操作进行响应、反馈的重要组件,而 DialogX 将可以协助开发者快速完成这些事务。

我们力求减少开发者所需要担心的,所需要顾虑的,而打造一款可以在任意时间,任意情况都能轻松使用的对话框组件。

在轻松使用的前提下,DialogX 提供了更多的个性接口方便开发者进行扩展,包括在对话框内插入自定义布局,亮暗色模式的切换,甚至自定义更符合 App UI 的自定义主题。

DialogX的特性:

  • DialogX 采用全新的实现方式,不依赖 AlertDialog、Window 或 Fragment 实现,更加轻便快捷。
  • DialogX 的启动与线程无关,你可以在任意线程启动 DialogX 而它都将自动在 UI 线程运行。
  • DialogX 的启动无需 context 参数,默认提供静态方法一句代码实现对话框的启动,使用更加方便。
  • 更自由,开发者可以轻松定制对话框中任何组件的样式,包括文本样式、按钮文字样式、菜单文本样式、输入文本样式,大到标题,小到提示消息都可以根据需要随意修改。
  • DialogX 采用主题分离设计,默认自带 Material 主题,可选引入 IOS、Kongzue 等其他风格主题,大大减小 App 体积,同时提供了主题接口,如有定制需求完全可以自行实现一套私有主题。
  • 更低的耦合度,更少的问题,DialogX 可以在对话框正在运行的过程中随意关闭 Activity ,而无需担心以往 AlertDialog 等组件会引发的 WindowLeaked 错误。
  • 更流畅的体验,DialogX 的动画效果更加丰富,对话框启动动画采用非线性动画实现,更自带连贯的等待提示到完成错误动画过渡效果,让你的 APP 更具动感。
  • 所有主题默认支持亮暗色两种模式,只需一键配置即可实现亮暗色的对话框主题切换,更有自由的布局内容满足定制化需求。
  • 轻松的实现对话框的生命周期管控以及沉浸式适配。

评估可行性

DialogV3 的最低 API 支持版本为 19,目标 API 版本为 29,DialogX 的最低 API 支持版本为 21,目标 API 版本为 30。若你的应用在使用 API 版本低于 21 则不建议升级。

目前 DialogX 是基于 AndroidX 构建的,若你正在基于 Support 版本的 Android 支持库则暂时不建议升级。

若是从 DialogV3 升级至 DialogX,你可能遇到以下情况:

  • 所有使用到 DialogV3 框架的代码可能需要进行修改。
  • import 类地址和名称可能发生变化。
  • 部分 DialogV3 的设置在 DialogX 中发生变化。
  • Notification 组件被移除。
  • 之前使用到 DialogV3 中的部分资源可能发生变化。

如何迁移

引入方式和设置发生变化

DialogX 需要一些初始化步骤,请参考 DialogX Wiki

设置因为 DialogX 和 DialogV3 存在组件差异,也发生了一定的变化,具体也请参照上述 Wiki 文档重新进行设置。

启动方式的变化

首先不可避免的是,DialogV3 和 DialogX 的启动方式是不同的,因为 DialogX 减少了 context 启动参数,对比一个最基础的消息对话框可以直观发现他们的区别:

DialogV3:
MessageDialog.show(appCompatActivity, "提示", "这是一条消息", "确定");
DialogX:
MessageDialog.show("提示","这是一条消息","确定");

引用包的地址变化

DialogV3:
import com.kongzue.dialog.v3.CustomDialog;
import com.kongzue.dialog.v3.FullScreenDialog;
import com.kongzue.dialog.v3.BottomMenu;
import com.kongzue.dialog.v3.MessageDialog;
import com.kongzue.dialog.v3.InputDialog;
import com.kongzue.dialog.v3.Notification;
import com.kongzue.dialog.v3.ShareDialog;
import com.kongzue.dialog.v3.TipDialog;
import com.kongzue.dialog.v3.WaitDialog;
import com.kongzue.dialog.interfaces.OnBackClickListener;
import com.kongzue.dialog.interfaces.OnDialogButtonClickListener;
import com.kongzue.dialog.interfaces.OnDismissListener;
import com.kongzue.dialog.interfaces.OnInputDialogButtonClickListener;
import com.kongzue.dialog.interfaces.OnMenuItemClickListener;
import com.kongzue.dialog.interfaces.OnNotificationClickListener;
import com.kongzue.dialog.interfaces.OnShowListener;
DialogX:
import com.kongzue.dialogx.DialogX;
import com.kongzue.dialogx.dialogs.BottomDialog;
import com.kongzue.dialogx.dialogs.BottomMenu;
import com.kongzue.dialogx.dialogs.CustomDialog;
import com.kongzue.dialogx.dialogs.FullScreenDialog;
import com.kongzue.dialogx.dialogs.InputDialog;
import com.kongzue.dialogx.dialogs.MessageDialog;
import com.kongzue.dialogx.dialogs.PopTip;
import com.kongzue.dialogx.dialogs.TipDialog;
import com.kongzue.dialogx.dialogs.WaitDialog;
import com.kongzue.dialogx.interfaces.BaseDialog;
import com.kongzue.dialogx.interfaces.DialogLifecycleCallback;
import com.kongzue.dialogx.interfaces.OnBackPressedListener;
import com.kongzue.dialogx.interfaces.OnBindView;
import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
import com.kongzue.dialogx.interfaces.OnIconChangeCallBack;
import com.kongzue.dialogx.interfaces.OnInputDialogButtonClickListener;
import com.kongzue.dialogx.interfaces.OnMenuItemClickListener;
import com.kongzue.dialogx.style.IOSStyle;
import com.kongzue.dialogx.style.KongzueStyle;
import com.kongzue.dialogx.style.MIUIStyle;
import com.kongzue.dialogx.style.MaterialStyle;
import com.kongzue.dialogx.util.TextInfo;

生命周期的变化

额外的,DialogX 的生命周期设置方式发生了变化,之前 DialogV3 采用的是独立的 OnShowListenerOnDismissListener 设置形式,但 DialogX 采用了集成设置形式,对比如下:

DialogV3:
TipDialog.show(appCompatActivity, "登录成功", TipDialog.TYPE.SUCCESS).setOnDismissListener(new OnDismissListener() {
    @Override
    public void onDismiss() {
    
    }
});
DialogX:
TipDialog.show("登录成功", TipDialog.TYPE.SUCCESS).setDialogLifecycleCallback(
new DialogLifecycleCallback<WaitDialog>() {
    @Override
    public void onDismiss(WaitDialog dialog) {
        
    }
});

DialogLifecycleCallback 接口可以单独重写 onShow(BaseDialog dialog)onDismiss(BaseDialog dialog) 方法,使代码更简单易懂,清晰明了,且通过泛型的使用,自动区别了返回参数中 BaseDialog 的类型,方便访问对应对话框组件中的方法。

主题的使用变化

因为 DialogX 是主题分离设计,本体只包含了默认的 Material 风格主题,不包含其他主题资源,需要使用其他主题资源你需要额外进行引入:

最新版本: Jitpack.io
dependencies {
    //添加对应的包文件,可根据需要选择,请将 latest.release 替换为上边的最新版本
    implementation 'com.kongzue.dialogx.style.ios:DialogXIOSStyle:latest.release'
    implementation 'com.kongzue.dialogx.style.kongzue:DialogXKongzueStyle:latest.release'
    implementation 'com.kongzue.dialogx.style.miui:DialogXMIUIStyle:latest.release'
    ...
}

因为这些额外引入的主题资源库需要单独配置 maven 仓库,你可能需要在 allprojectsbuildscript下的repositories中配置:

allprojects {
    repositories {
        google()
        jcenter()
        maven{
            url 'https://dl.bintray.com/myzchh/maven'
        }
    }
}

具体使用方式请参考使用其他 DialogX主题

其他需要注意的

我们知道 DialogX 相比于 DialogV3 API 发生了很大的变化,作为开发者,和你一样我们自己也有很多重要的产品在从 DialogV3 组件迁移至 DialogX,这个过程确实是痛苦的。我们也尽量避免发生 API 的变化,但因为需要更合理的设计,很多修改都是不得不进行的。新的接口 API 设计更加注重可靠性和灵活性,且尽可能的保证了使用方法和以前基本是一致的,但一些细节的调整不可避免,尽管如此我们依然建议你尽快的迁移至新版本的库,以保证更长的维护周期,因为人手有限,我们可能在一段时间后停止 DialogV3 的继续维护。

在开发 DialogV3 的过程中,Google 一共进行了 5 个系统 API 的升级,特别是 Support 支持库到 AndroidX 的升级导致了很多问题,DialogV3 是强依赖界面的组件,早期是基于 Support 库进行开发的,在这个过程中我们不得不进行了分支并行开发,同时维护 Support 版本和 AndroidX 版本,且得保持两者的代码更新一致这非常耗费时间和精力,新版本中我们优先使用了 AndroidX 支持库进行开发,将看情况是否对 Support 库版本进行支持。

以下是整理出的一些新变化:

  • DialogX 取消了“模态化”设计,这意味着每个启动的 Dialog 将不再持续持有 context,经过调查我们发现实际上在 Android 平台需要“模态化”对话框设计的场景并不多,这点在 DialogV3 后期默认取消“模态化”设置就可以看出。
  • DialogX 新增了新的组件 PopTip,这个轻提示类似于 Toast 不会中断用户操作,但因 Google 反射权限的收紧,也不再能实现跨界面显示的效果。
  • DialogX 暴露了大部分可供使用的内部组件,你只需要使用 dialog.getDialogImpl()即可获取当前已启动对话框的实例化组件内容,对其进行直接修改和操作,这个操作建议先熟悉 DialogX 对话框布局中有哪些组件,下载 项目源码 可以轻松进行尝试。
  • DialogX 提供了自由定制主题的可能性,你可以从界面样式到动画效果全程进行完整的定制,具体请参考 自定义 DialogX 主题

其他变化请关注此文档的后续更新。

如有任何技术支持的需要,你可以加入群进行讨论:590498789

反馈 DialogX
Clone this wiki locally