Android 简简单单封装一个Dialog

Android 简简单单封装一个Dialog,第1张

Android 简简单单封装一个Dialog

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()

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5612693.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-15

发表评论

登录后才能评论

评论列表(0条)

    保存