Android开发实践之通用Dialog封装

通用Dialog封装

Android开发实践之通用Dialog封装

前言

在日常android开发中,我们会碰到各式各样的Dialog,一般情况下,我们都会封装一个通用的Dialog“壳子”去装不同风格的View,以减少样板代码的书写,今天就来说一说如何封装这个“壳子”。

自定义Dialog主题

Android默认的Dialog主题样式会包括标题栏,背景颜色等,这些通常情况下我们都不需要,会影响Dialog的显示效果,我们需要自定义主题把这些属性去掉,主题样式配置如下:


封装Dialog

Dialog的封装方式有很多种,可以继承Dialog或者AppCompatDialog类进行封装,又或者直接封装一个Dialog相关的工具类,今天我们尝试封装一个Dialog相关的工具类。

代码示例如下:

// DialogUtils.kt

@JvmOverloads
fun createDialog(
    context: Context,
    layoutResId: Int,
    isCanceled: Boolean,
    gravity: Int = Gravity.CENTER,
    style: Int? = null,
    block: (AppCompatDialog.() -> Unit)? = null
): AppCompatDialog = AppCompatDialog(context, R.style.BaseDialogTheme).also { dialog ->
    dialog.setContentView(layoutResId)
    dialog.setCanceledOnTouchOutside(isCanceled)
    val window = dialog.window
    val layoutParams = window?.attributes
    layoutParams?.width = ViewGroup.LayoutParams.MATCH_PARENT
    layoutParams?.height = ViewGroup.LayoutParams.WRAP_CONTENT
    layoutParams?.gravity = gravity
    window?.attributes = layoutParams
    style?.let { window?.setWindowAnimations(it) }
    block?.let { it(dialog) }
}

@JvmOverloads
fun showDialog(
    context: Context,
    layoutResId: Int,
    isCanceled: Boolean = true,
    gravity: Int = Gravity.CENTER,
    style: Int? = null,
    block: (AppCompatDialog.() -> Unit)? = null
): AppCompatDialog = createDialog(context, layoutResId, isCanceled, gravity, style, block).apply {
    show()
}

封装要点:

  • Dialog的View要求可配置
  • 半透明阴影区域点击取消可配置
  • Dialog的View显示区域可配置
  • Dialog进出动画可配置

一般达到上面四点要求之后就能满足大多数样式的Dialog。

总结

这篇文章仅给出通用Dialog封装的示例,具体该如何封装还需根据项目需要来进行。

你可能感兴趣的:(Android开发实践之通用Dialog封装)