kotlin使用建造者模式自定义对话框

发布时间:2026/8/27 13:16:11
kotlin使用建造者模式自定义对话框 本文实例为大家分享了kotlin自定义对话框的具体代码供大家参考具体内容如下1.CommonDialog 创建我们自己的对话框,继承于系统的Dialog 实现构造方法classCommonDialog(context:Context?,themeResId:Int):Dialog(context,themeResId){}\2. 在内部创建BUilder类 定义出我们需要的方法和属性classBuilder(privateval context:Context){privatevartitle:String?nullprivatevarmessage:String?nullprivatevarpositiveButtonContent:String?nullprivatevarnegativeButtonContent:String?nullprivatevarpositiveButtonListener:DialogInterface.OnClickListener?nullprivatevarnegativeButtonListener:DialogInterface.OnClickListener?nullprivatevarcontentView:View?nullprivatevarimageid:Int0privatevarcolor:Int0privatevarwithOffSize:Float0.toFloat()privatevarheightOffSize:Float0.toFloat()funsetTitle(title:String):Builder{this.titletitlereturnthis}funsetTitle(title:Int):Builder{this.titlecontext.getText(title)asStringreturnthis}funsetMessage(message:String):Builder{this.messagemessagereturnthis}funsetMessageColor(color:Int):Builder{this.colorcolorreturnthis}funsetImageHeader(Imageid:Int):Builder{this.imageidImageidreturnthis}funsetPositiveButton(text:String,listener:DialogInterface.OnClickListener):Builder{this.positiveButtonContenttextthis.positiveButtonListenerlistenerreturnthis}funsetPositiveButton(textId:Int,listener:DialogInterface.OnClickListener):Builder{this.positiveButtonContentcontext.getText(textId)asStringthis.positiveButtonListenerlistenerreturnthis}funsetNegativeButton(text:String,listener:DialogInterface.OnClickListener):Builder{this.negativeButtonContenttextthis.negativeButtonListenerlistenerreturnthis}funsetNegativeButton(textId:Int,listener:DialogInterface.OnClickListener):Builder{this.negativeButtonContentcontext.getText(textId)asStringthis.negativeButtonListenerlistenerreturnthis}funsetContentView(v:View):Builder{this.contentViewvreturnthis}funsetWith(v:Float):Builder{this.withOffSizevreturnthis}funsetContentView(v:Float):Builder{this.heightOffSizevreturnthis}funcreate():CommonDialog{/** * 利用我们刚才自定义的样式初始化Dialog */val dialogCommonDialog(context,R.style.dialogStyle)/** * 下面就初始化Dialog的布局页面 */val inflatercontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)asLayoutInflater val dialogLayoutViewinflater.inflate(R.layout.dialog_layout,null)dialog.addContentView(dialogLayoutView,ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT))if(imageid!0){(dialogLayoutView.findViewByIdView(R.id.iv_image_header)asImageView).setImageResource(imageid)}else{(dialogLayoutView.findViewByIdView(R.id.iv_image_header)asImageView).visibilityView.GONE}if(!TextUtils.isEmpty(title)){(dialogLayoutView.findViewByIdView(R.id.tv_dialog_title)asTextView).texttitle}else{// Log.w(context.getClass().toString(), 未设置对话框标题);}if(color!0){val viewByIddialogLayoutView.findViewByIdView(R.id.dialog_content)asTextView viewById.setTextColor(color)}if(!TextUtils.isEmpty(message)){(dialogLayoutView.findViewByIdView(R.id.dialog_content)asTextView).textmessage}elseif(contentView!null){(dialogLayoutView.findViewByIdView(R.id.dialog_llyout_content)asLinearLayout).removeAllViews()(dialogLayoutView.findViewByIdView(R.id.dialog_llyout_content)asLinearLayout).addView(contentView,ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT))}else{(dialogLayoutView.findViewByIdView(R.id.dialog_content)asTextView).visibilityView.INVISIBLE}if(!TextUtils.isEmpty(positiveButtonContent)){(dialogLayoutView.findViewByIdView(R.id.tv_dialog_pos)asTextView).textpositiveButtonContentif(positiveButtonListener!null){(dialog.findViewByIdView(R.id.tv_dialog_pos)asTextView).setOnClickListener{positiveButtonListener!!.onClick(dialog,-1)}}}else{(dialogLayoutView.findViewByIdView(R.id.tv_dialog_pos)asTextView).visibilityView.GONEdialogLayoutView.findViewByIdView(R.id.line).visibilityView.GONE}if(!TextUtils.isEmpty(negativeButtonContent)){(dialogLayoutView.findViewByIdView(R.id.tv_dialog_neg)asTextView).textnegativeButtonContentif(negativeButtonListener!null){(dialogLayoutView.findViewByIdView(R.id.tv_dialog_neg)asTextView).setOnClickListener{negativeButtonListener!!.onClick(dialog,-2)}}}else{(dialogLayoutView.findViewByIdView(R.id.tv_dialog_neg)asTextView).visibilityView.GONE}/** * 将初始化完整的布局添加到dialog中 */dialog.setContentView(dialogLayoutView)/** * 禁止点击Dialog以外的区域时Dialog消失 */dialog.setCanceledOnTouchOutside(false)val windowdialog.window val contextthis.contextasActivity val windowManagercontext.windowManager val defaultDisplaywindowManager.defaultDisplay val attributeswindow!!.attributesif(withOffSize.toDouble()!0.0){attributes.width(defaultDisplay.width*withOffSize).toInt()}else{attributes.width(defaultDisplay.width*0.77).toInt()}if(heightOffSize.toDouble()!0.0){attributes.height(defaultDisplay.height*heightOffSize).toInt()}window.attributesattributesreturndialog}}3.在需要的地方使用CommonDialog.Builder(this).setImageHeader(R.mipmap.icon_gantan_tankuang).setTitle(你是否要注销账户).setMessage(注销后需重新注册才能使用牛返返优惠).setPositiveButton(确定注销,DialogInterface.OnClickListener{p0,p1-p0?.dismiss()DestroyAccount()}).setNegativeButton(取消,DialogInterface.OnClickListener{p0,p1-p0?.dismiss()}).setWith(0.77f).create().show()实现效果以上就是本文的全部内容希望对大家的学习有所帮助。更多Android进阶指南 可以扫码 解锁《Android十大板块文档》1.Android车载应用开发系统学习指南附项目实战2.Android Framework学习指南助力成为系统级开发高手3.2024最新Android中高级面试题汇总解析告别零offer4.企业级Android音视频开发学习路线项目实战附源码5.Android Jetpack从入门到精通构建高质量UI界面6.Flutter技术解析与实战跨平台首要之选7.Kotlin从入门到实战全方面提升架构基础8.高级Android插件化与组件化含实战教程和源码9.Android 性能优化实战360°全方面性能调优10.Android零基础入门到精通高手进阶之路敲代码不易关注一下吧。ღ( ´ᴗ )