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封装的示例,具体该如何封装还需根据项目需要来进行。
网友评论