优秀案例

Android开发实践之通用Dialog封装

2020-07-02  本文已影响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。

总结

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

上一篇 下一篇

猜你喜欢

热点阅读