Android開發(fā)實(shí)踐之通用Dialog封裝
前言
在日常android開發(fā)中惋啃,我們會(huì)碰到各式各樣的Dialog
,一般情況下毅该,我們都會(huì)封裝一個(gè)通用的Dialog
“殼子”去裝不同風(fēng)格的View博秫,以減少樣板代碼的書寫,今天就來(lái)說(shuō)一說(shuō)如何封裝這個(gè)“殼子”眶掌。
自定義Dialog主題
Android默認(rèn)的Dialog主題樣式會(huì)包括標(biāo)題欄挡育,背景顏色等,這些通常情況下我們都不需要朴爬,會(huì)影響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
類進(jìn)行封裝蒿叠,又或者直接封裝一個(gè)Dialog相關(guān)的工具類,今天我們嘗試封裝一個(gè)Dialog相關(guān)的工具類蚣常。
代碼示例如下:
// 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()
}
封裝要點(diǎn):
- Dialog的View要求可配置
- 半透明陰影區(qū)域點(diǎn)擊取消可配置
- Dialog的View顯示區(qū)域可配置
- Dialog進(jìn)出動(dòng)畫可配置
一般達(dá)到上面四點(diǎn)要求之后就能滿足大多數(shù)樣式的Dialog市咽。
總結(jié)
這篇文章僅給出通用Dialog封裝的示例,具體該如何封裝還需根據(jù)項(xiàng)目需要來(lái)進(jìn)行抵蚊。