/**
* 當前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 = ""http://標題
private var mContent: String = ""http://文案
private var mConfirmTxt: String = ""http://確定按鈕文案
private var mCancelTxt: String = ""http://取消按鈕文案
private var mCanceledOnTouchOutside: Boolean = true//是否需要關閉按鈕 默認true
private var confirmListener: () -> Unit = {}//確定監(jiān)聽
private var cancelListener: () -> Unit = {}//取消監(jiān)聽
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
}
/*
* 設置內(nèi)容
* */
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
}
/*
* 創(chuàng)建按鈕
* */
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)
//置空緩存解決彈窗緩存其他彈窗數(shù)據(jù)
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)
/*內(nèi)容*/
//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)
/*按鈕監(jiān)聽*/
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內(nèi)容
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]
}
}
}
/*按鈕監(jiān)聽*/
//確定按鈕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
}
/*據(jù)和接口實現(xiàn)*/
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)
}
}
}
/*定制接口
* */
}
NYDialog
最后編輯于 :
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門滴肿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人佃迄,你說我怎么就攤上這事泼差」笊伲” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵堆缘,是天一觀的道長滔灶。 經(jīng)常有香客問我,道長吼肥,這世上最難降的妖魔是什么录平? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮缀皱,結果婚禮上斗这,老公的妹妹穿的比我還像新娘。我一直安慰自己唆鸡,他們只是感情好涝影,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著争占,像睡著了一般燃逻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臂痕,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肥卡!你這毒婦竟也來了溪掀?” 一聲冷哼從身側響起,我...
- 正文 年R本政府宣布即供,位于F島的核電站,受9級特大地震影響于微,放射性物質(zhì)發(fā)生泄漏逗嫡。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一驱证、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦吻育、人聲如沸布疼。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽粟害。三九已至,卻和暖如春套鹅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菱魔。 一陣腳步聲響...