栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android 简简单单封装一个Dialog

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/606553.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号