s如题封装一个简单的Dialog基类。支持居上下左右,可设置是否铺满屏幕、是否需要阴影、上下偏移、是否可以点击外部关闭、设置dismiss监听。
还提供了一些方便设置view属性的方法。
package com.youthmba.ymbaandroid.appbiz.basics.widget.dialog
import android.app.Activity
import android.app.alertDialog
import android.content.Context
import android.content.DialogInterface
import android.graphics.Color
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import android.widget.ImageView
import android.widget.TextView
import com.youthmba.ymbaandroid.R
import kotlin.Int as Int1
abstract class baseDialog(var context: Context,var layoutId: Int1, var gravity: Int1, var matchParent:Boolean, var needDim:Boolean, var y:Int1) {
constructor(context: Context,layoutId: kotlin.Int):this(context,layoutId,Gravity.CENTER,false,true,-1)
constructor(context: Context, layoutId: Int1, gravity: Int1):this(context,layoutId,gravity,false,true,-1)
constructor(context: Context, layoutId: Int1, matchParent: Boolean):this(context,layoutId,Gravity.CENTER,matchParent,true,-1)
constructor(context: Context,layoutId: kotlin.Int,gravity: Int1,matchParent:Boolean):this(context,layoutId,gravity,matchParent,true,-1)
constructor(context: Context,layoutId: kotlin.Int,gravity: Int1,matchParent:Boolean, needDim:Boolean):this(context,layoutId,gravity,matchParent,needDim,-1)
protected var contentView :View?= null
fun show(){
contentView = LayoutInflater.from(context).inflate(layoutId, null)
contentView?.let {
val dialog = alertDialog.Builder(context,getStyle())
.setView(it)
.setCancelable(getCancelable())
.setonDismissListener(getonDismissListener())
.create()
initView(it,dialog)
if(!(context as Activity).isFinishing){
dialog.show()
// 把 DecorView 的默认 padding 取消,同时 DecorView 的默认大小也会取消
val window = dialog.window
window?.decorView?.setPadding(0, 0, 0, 0)
val layoutParams = window?.attributes
// 设置宽度
if(y != -1) {
layoutParams?.y = y
}
layoutParams?.width = if (matchParent) WindowManager.LayoutParams.MATCH_PARENT else WindowManager.LayoutParams.WRAP_ConTENT
layoutParams?.height = WindowManager.LayoutParams.WRAP_ConTENT
layoutParams?.gravity = gravity
window?.attributes = layoutParams
// 给 DecorView 设置背景颜色,很重要,不然导致 Dialog 内容显示不全,有一部分内容会充当 padding,上面例子有举出
window?.decorView?.setBackgroundColor(Color.TRANSPARENT)
}
}
}
private fun getStyle(): Int1 {
return when(gravity){
Gravity.BOTTOM->R.style.BottomDialog
Gravity.TOP->{
if(needDim) R.style.TopDialog
else R.style.TopDialogNoDim
}
else -> R.style.CenterDialog
}
}
//可重写设置是否可以点击dialog外部关闭
open fun getCancelable():Boolean{
return true
}
//可重写设置dialog dismiss监听
open fun getonDismissListener(): DialogInterface.OnDismissListener? {
return null
}
protected abstract fun initView(contentView: View,dialog:alertDialog)
fun setText(viewId:Int1 ,text:String){
contentView?.findViewById(viewId)?.text = text
}
fun setonClickListener(viewId:Int1 ,listener:View.OnClickListener){
contentView?.findViewById(viewId)?.setonClickListener(listener)
}
fun setTextColor(viewId:Int1 , color:Int1){
contentView?.findViewById(viewId)?.setTextColor(color)
}
fun setBackgroundResource(viewId:Int1 ,backgroundResource:Int1){
contentView?.findViewById(viewId)?.setBackgroundResource(backgroundResource)
}
fun setImageResource(viewId:Int1 ,imageResource:Int1){
contentView?.findViewById(viewId)?.setImageResource(imageResource)
}
fun setGone(viewId:Int1 ,gone:Boolean){
contentView?.findViewById(viewId)?.visibility = if(gone) View.GONE else View.VISIBLE
}
}
style.xml
- @anim/anim_from_bottom_in
- @anim/anim_from_bottom_out
- @anim/anim_from_up_in
- @anim/anim_from_up_out
- @android:style/Animation.Dialog
- @android:color/transparent
- @style/FromBottom
- @android:color/transparent
- @style/FromTop
- @android:color/transparent
- false
- @style/FromTop
- @android:color/transparent
anim/anim_from_bottom_in:anim/anim_from_bottom_out: anim/anim_from_bottom_out: anim/anim_from_up_out:
使用:
package com.youthmba.ymbaandroid.appbiz.read.common
import android.app.alertDialog
import android.content.Context
import android.view.View
import com.youthmba.ymbaandroid.R
import com.youthmba.ymbaandroid.appbiz.basics.widget.dialog.baseDialog
class QuestionExitDialog(context: Context,var isPractice:Boolean,var callback: Callback?) : baseDialog(context,R.layout.dialog_book_question) {
override fun initView(contentView: View, dialog: alertDialog) {
setonClickListener(R.id.tvSure) {
dialog.dismiss()
callback?.sure()
}
if (isPractice) {
setBackgroundResource(R.id.tvCancel,R.drawable.btn_02cccc_r22)
setTextColor(R.id.tvCancel,R.color.colorFFFFFF)
}
setonClickListener(R.id.tvCancel) {
dialog.dismiss()
}
}
interface Callback {
fun sure()
}
}
QuestionExitDialog(this,false, object : QuestionExitDialog.Callback {
override fun sure() {
finish()
}
}).show()



