/**
* 当前release 1.0版本
* 当前dialog支持如下:
* 底部button支持一到两个,支持横竖向排列,支持热拔插
* 头部容器支持自定义配置
* 底部容器支持自定义设置
* 文本title和文本content支持选择配置
* 底部按钮支持自定义背景
* 关闭按钮支持热插拔
* ----------------------------------
* beta版本支持如下:
* 弹窗关闭配置 setCanceledOnTouchOutside
* 弹窗支持背景多样化处理 纹路
* 弹窗支持配置标识 标识
* ----------------------------------
* beta2版本支持如下:
* 底部多button(大于两个button)配置
* 支持button比例分割处理
*-----------------------------------
* beta3版本支持如下
* 支持扩展自定义
* create by LiYan
*/
class NYDialog(context: Context, config: AbsHintDialogMainInterface?, view: View?) : Dialog(context, R.style.dialog_translucent) {
init {
val layout = LayoutInflater.from(context).inflate(R.layout.hint_dialog, null)
setContentView(view ?: layout)
config?.init(layout, this, window)
}
companion object Builder {
private var config: AbsHintDialogMainInterface? = null//可定制接口
private var mTitle: String = ""//标题
private var mContent: String = ""//文案
private var mConfirmTxt: String = ""//确定按钮文案
private var mCancelTxt: String = ""//取消按钮文案
private var mCanceledOnTouchOutside: Boolean = true//是否需要关闭按钮 默认true
private var confirmListener: () -> Unit = {}//确定监听
private var cancelListener: () -> Unit = {}//取消监听
private var mGravity: Int = Gravity.CENTER//Dialog显示的方向
//设置Dialog方向
private var mPaddingEnd: Int = 20
private var mPaddingStart: Int = 20
private var mPaddingTop: Int = 0
private var mPaddingBottom: Int = 0
//设置Dialog大小
private var mWidth: Int = WindowManager.LayoutParams.MATCH_PARENT
private var mHeight: Int = WindowManager.LayoutParams.WRAP_CONTENT
/*
* 设置自定义方法
* 默认可以不写
* */
fun Builder(config: AbsHintDialogMainInterface): Builder {
this.config = config
return this
}
/*
*设置Title
* */
fun title(title: String?): Builder {
if (title != null) {
this.mTitle = title
}
return this
}
/*
* 设置内容
* */
fun content(content: String?): Builder {
if (content != null) {
this.mContent = content
}
return this
}
/*
* 设置确定按钮文案
* */
fun confirmTxt(confirmTxt: String?): Builder {
if (confirmTxt != null) {
this.mConfirmTxt = confirmTxt
}
return this
}
/*
* 设置方向
* */
fun setGravity(gravity: Int) {
mGravity = gravity
}
/*设置取消按钮文案
* */
fun cancelTxt(cancelTxt: String?): Builder {
if (cancelTxt != null) {
this.mCancelTxt = cancelTxt
}
return this
}
/**
* @param confirmLisenter: () -> Unit 确定按钮方法
* @param cancelLisenter: () -> Unit 取消按钮方法
* */
fun click(confirmLisenter: () -> Unit, cancelLisenter: () -> Unit): Builder {
this.confirmListener = confirmLisenter
this.cancelListener = cancelLisenter
return this
}
/*
* 设置是否点击外部可以关闭
* */
fun serCancelable(canceledOnTouchOutside: Boolean) {
this.mCanceledOnTouchOutside = canceledOnTouchOutside
}
//设置padding
fun setNYDialogPadding(left: Int, top: Int, right: Int, bottom: Int) {
mPaddingEnd = right
mPaddingStart = left
mPaddingTop = top
mPaddingBottom = bottom
}
//设置大小
fun setNYDialogParams(width: Int, height: Int) {
mWidth = width
mHeight = height
}
/*
* 创建按钮
* */
fun create(context: Context): NYDialog {
config?.apply {
inflaterBtnTxt(mConfirmTxt, mCancelTxt)
inflaterMainTxt(mTitle, mContent)
setConfirmLisenter(confirmListener)
setCancelLisenter(cancelListener)
setNYDialogPadding(mPaddingStart, mPaddingTop, mPaddingEnd, mPaddingBottom)
setNYDialogParams(mWidth, mHeight)
setGravity(mGravity)
//置空缓存解决弹窗缓存其他弹窗数据
mTitle = ""
mContent = ""
mCancelTxt = ""
mConfirmTxt = ""
confirmListener = {}
confirmListener = {}
mPaddingStart = 20
mPaddingEnd = 20
mPaddingTop = 0
mPaddingBottom = 0
mWidth = WindowManager.LayoutParams.MATCH_PARENT
mHeight = WindowManager.LayoutParams.WRAP_CONTENT
mGravity = Gravity.CENTER
}
val nyDialog = NYDialog(context, config, null)
nyDialog.setCanceledOnTouchOutside(mCanceledOnTouchOutside)//点击外部可关闭
return nyDialog
}
}
abstract class AbsHintDialogMainInterface : INYDialogMainInterface {
private var dialogTitle: String = ""
private var dialogContent: String = ""
private var dialogConfirmTitle: String = ""
private var dialogCancelContent: String = ""
private var confirmLisenter: () -> Unit = {}
private var cancelLisenter: () -> Unit = {}
//NY接口扩展
protected var chirldren: (btnOk: View, btnCanCel: View, clContainer: LinearLayout) -> Unit = { view: View, view1: View, linearLayout: LinearLayout -> }
//Dialog显示的方向
private var mGravity: Int = Gravity.CENTER
//设置底部按钮方向
private var direct: Int = LinearLayout.VERTICAL
//设置Dialog方向
private var mPaddingEnd: Int = 0
private var mPaddingStart: Int = 0
private var mPaddingTop: Int = 0
private var mPaddingBottom: Int = 0
//设置Dialog大小
private var mWidth: Int = 0
private var mHeight: Int = 0
//初始Dialog
override fun init(layout: View, nyDialog: NYDialog, window: Window?) {
window?.let {
it.attributes.width = mWidth
it.attributes.height = mHeight
it.setGravity(Gravity.CENTER)
it.decorView.setPadding(mPaddingStart, mPaddingTop, mPaddingEnd, mPaddingBottom)
it.attributes.horizontalMargin = 0f
it.attributes.verticalMargin = 0f
}
//clContainer
val clContainer = layout.findViewById<LinearLayout>(R.id.clContainer)
/*view填充*/
//头部View填充
val headerDesc = layout.findViewById<FrameLayout>(R.id.rl_header_desc)
//底部View填充
val bottomDesc = layout.findViewById<FrameLayout>(R.id.rl_bottom_desc)
/*内容*/
//Title
val tvTitle = layout.findViewById<TextView>(R.id.ivVipTitleDes)
//content
val tvContent = layout.findViewById<TextView>(R.id.tvVipDayCome)
/*按钮*/
//Ok
val btnOk = layout.findViewById<TextView>(R.id.btnOnline)
//Cancel
val btnCancel = layout.findViewById<TextView>(R.id.btn_random)
// 关闭按钮
val ivClose = layout.findViewById<ImageView>(R.id.ivClose)
//bottom
val bottomBtns = layout.findViewById<LinearLayout>(R.id.ll_bottom_btns)
/*按钮监听*/
btnOk.setOnClickListener {
confirmLisenter()
nyDialog.dismiss()
}
btnCancel.setOnClickListener {
cancelLisenter()
nyDialog.dismiss()
}
ivClose.setOnClickListener {
cancelLisenter()
nyDialog.dismiss()
}
/*是否需要关闭按钮*/
if (needCloseIcon()) {
ivClose.visibility = View.VISIBLE
} else {
ivClose.visibility = View.GONE
}
/*判断是否需要显示按钮*/
if (provideTitleDesc().isNotEmpty()) tvTitle.text = provideTitleDesc() else tvTitle.visibility = View.GONE
if (provideContentDesc().isNotEmpty()) tvContent.text = provideContentDesc() else tvContent.visibility = View.GONE
if (provideConfirmDesc().isNotEmpty()) btnOk.text = provideConfirmDesc() else btnOk.visibility = View.GONE
if (provideCancelDesc().isNotEmpty()) btnCancel.text = provideCancelDesc() else btnCancel.visibility = View.GONE
if (!btnOk.isVisible && !btnCancel.isVisible) {
bottomBtns.visibility = View.GONE
}
//设置按钮背景
provideCancelBtnBg()?.let { btnCancel.setBackgroundResource(it) }//取消
/*自定义按钮*/
provideConfirmBtnAndCancel(btnOk, btnCancel)
/*自定义文案*/
provideTitleAndContent(tvTitle, tvContent)
//头部添加View
inflateDialogHeader()?.let {
headerDesc.removeAllViews()
headerDesc.addView(it)
}
//底部添加View
inflateDialogBottom()?.let {
bottomDesc.removeAllViews()
bottomDesc.addView(it)
}
//按钮方向
bottomBtns.orientation = provideBottomBtnOrientation()
chirldren(btnOk, btnCancel, clContainer)
}
//设置padding
fun setNYDialogPadding(left: Int, top: Int, right: Int, bottom: Int) {
mPaddingEnd = right
mPaddingStart = left
mPaddingTop = top
mPaddingBottom = bottom
}
//设置大小
fun setNYDialogParams(width: Int, height: Int) {
mWidth = width
mHeight = height
}
//设置在屏幕中的位置
fun setGravity(gravity: Int) {
mGravity = gravity
}
//Dialog头部 默认为空
override fun inflateDialogHeader(): View? {
return null
}
//添加底部View 默认为空
override fun inflateDialogBottom(): View? {
return null
}
//设置底部按钮方向
override fun provideBottomBtnOrientation(): Int {
return direct
}
//是否需要关闭按钮 方法已过期
@Deprecated("已移置Build", ReplaceWith("true"))
override fun needCloseIcon(): Boolean {
return true
}
/**
*@link # provideConfirmBtnAndCancel()
* 取消背景 方法过期
* */
@Deprecated("已移置 provideConfirmBtnAndCancel()", ReplaceWith("null"))
open fun provideCancelBtnBg(): Int? {
return null
}
/*文案*/
//title
private fun provideTitleDesc(): String {
return dialogTitle
}
//content
private fun provideContentDesc(): String {
return dialogContent
}
//设置title内容
fun inflaterMainTxt(vararg args: String) {
if (args.size == 2) {
if (args[0].isNotEmpty()) {
dialogTitle = args[0]
}
if (args[1].isNotEmpty()) {
dialogContent = args[1]
}
}
}
//确定按钮
private fun provideConfirmDesc(): String {
return dialogConfirmTitle
}
//取消按钮
private fun provideCancelDesc(): String {
return dialogCancelContent
}
//设置按钮文案
fun inflaterBtnTxt(vararg args: String) {
if (args.size == 2) {
if (args[0].isNotEmpty()) {
dialogConfirmTitle = args[0]
}
if (args[1].isNotEmpty()) {
dialogCancelContent = args[1]
}
}
}
/*按钮监听*/
//确定按钮Click
internal fun setConfirmLisenter(confirmLisenter: () -> Unit) {
this.confirmLisenter = confirmLisenter
}
//取消按钮Click
internal fun setCancelLisenter(cancelLisenter: () -> Unit) {
this.cancelLisenter = cancelLisenter
}
/*自定义样式*/
//自定义按钮样式
override fun provideConfirmBtnAndCancel(confirm: TextView, cancel: TextView) {
}
//自定义文案样式
override fun provideTitleAndContent(title: TextView, content: TextView) {
}
}
/**
* 主体接口
*/
private interface INYDialogMainInterface {
//初始化
fun init(layout: View, nyDialog: NYDialog, window: Window?)
/**
* 头部填充
*/
fun inflateDialogHeader(): View?
/**
* 底部View填充
*/
fun inflateDialogBottom(): View?
/**
* 关闭按钮是否需要
*/
fun needCloseIcon(): Boolean
/**
* confirm/cancel 按钮设置
*/
fun provideConfirmBtnAndCancel(confirm: TextView, cancel: TextView)
/*
* title/content
* */
fun provideTitleAndContent(title: TextView, content: TextView)
/**
* 底部按钮排列方向
*/
fun provideBottomBtnOrientation(): Int
}
/**
* 聚合接口
*/
private interface INYDialogCompactInterface : INYDialogMainInterface {
fun cancelBtnBg(): Int
fun confirmBtnBg(): Int
fun DialogBg(): Int
}
/*据和接口实现*/
abstract class AbsHintDialogCompactInterface : AbsHintDialogMainInterface(), INYDialogCompactInterface {
private var mCancelBg: Int = R.drawable.common_btn_primary_bg
private var mConfirmBtnBg: Int = R.drawable.common_btn_primary_bg
private var mDialogBg: Int = R.drawable.common_dialog_rect_white_bg
//按钮取消背景颜色
override fun cancelBtnBg(): Int {
return mCancelBg
}
//确认按钮背景颜色
override fun confirmBtnBg(): Int {
return mConfirmBtnBg
}
override fun DialogBg(): Int {
return mDialogBg
}
init {
chirldren = { btnOk: View, btnCanCel: View, dialogBg: LinearLayout ->
btnOk.setBackgroundResource(mConfirmBtnBg)
btnCanCel.setBackgroundResource(mCancelBg)
dialogBg.setBackgroundResource(mConfirmBtnBg)
}
}
}
/*定制接口
* */
}
网友评论