美文网首页优秀案例
Android开发实践之通用Dialog封装

Android开发实践之通用Dialog封装

作者: 一笨正经的小屁孩 | 来源:发表于2020-07-02 16:23 被阅读0次
通用Dialog封装

Android开发实践之通用Dialog封装

前言

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

自定义Dialog主题

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

<style name="BaseDialogTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">true</item>
</style>

封装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封装

    本文链接:https://www.haomeiwen.com/subject/ghprqktx.html