news 2026/8/27 13:16:01

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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:Int=0privatevarcolor:Int=0privatevarwithOffSize:Float=0.toFloat()privatevarheightOffSize:Float=0.toFloat()funsetTitle(title:String):Builder{this.title=titlereturnthis}funsetTitle(title:Int):Builder{this.title=context.getText(title)asStringreturnthis}funsetMessage(message:String):Builder{this.message=messagereturnthis}funsetMessageColor(color:Int):Builder{this.color=colorreturnthis}funsetImageHeader(Imageid:Int):Builder{this.imageid=Imageidreturnthis}funsetPositiveButton(text:String,listener:DialogInterface.OnClickListener):Builder{this.positiveButtonContent=textthis.positiveButtonListener=listenerreturnthis}funsetPositiveButton(textId:Int,listener:DialogInterface.OnClickListener):Builder{this.positiveButtonContent=context.getText(textId)asStringthis.positiveButtonListener=listenerreturnthis}funsetNegativeButton(text:String,listener:DialogInterface.OnClickListener):Builder{this.negativeButtonContent=textthis.negativeButtonListener=listenerreturnthis}funsetNegativeButton(textId:Int,listener:DialogInterface.OnClickListener):Builder{this.negativeButtonContent=context.getText(textId)asStringthis.negativeButtonListener=listenerreturnthis}funsetContentView(v:View):Builder{this.contentView=vreturnthis}funsetWith(v:Float):Builder{this.withOffSize=vreturnthis}funsetContentView(v:Float):Builder{this.heightOffSize=vreturnthis}funcreate():CommonDialog{/** * 利用我们刚才自定义的样式初始化Dialog */val dialog=CommonDialog(context,R.style.dialogStyle)/** * 下面就初始化Dialog的布局页面 */val inflater=context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)asLayoutInflater val dialogLayoutView=inflater.inflate(R.layout.dialog_layout,null)dialog.addContentView(dialogLayoutView,ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT))if(imageid!=0){(dialogLayoutView.findViewById<View(R.id.iv_image_header)asImageView).setImageResource(imageid)}else{(dialogLayoutView.findViewById<View(R.id.iv_image_header)asImageView).visibility=View.GONE}if(!TextUtils.isEmpty(title)){(dialogLayoutView.findViewById<View(R.id.tv_dialog_title)asTextView).text=title}else{// Log.w(context.getClass().toString(), "未设置对话框标题!");}if(color!=0){val viewById=dialogLayoutView.findViewById<View(R.id.dialog_content)asTextView viewById.setTextColor(color)}if(!TextUtils.isEmpty(message)){(dialogLayoutView.findViewById<View(R.id.dialog_content)asTextView).text=message}elseif(contentView!=null){(dialogLayoutView.findViewById<View(R.id.dialog_llyout_content)asLinearLayout).removeAllViews()(dialogLayoutView.findViewById<View(R.id.dialog_llyout_content)asLinearLayout).addView(contentView,ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT))}else{(dialogLayoutView.findViewById<View(R.id.dialog_content)asTextView).visibility=View.INVISIBLE}if(!TextUtils.isEmpty(positiveButtonContent)){(dialogLayoutView.findViewById<View(R.id.tv_dialog_pos)asTextView).text=positiveButtonContentif(positiveButtonListener!=null){(dialog.findViewById<View(R.id.tv_dialog_pos)asTextView).setOnClickListener{positiveButtonListener!!.onClick(dialog,-1)}}}else{(dialogLayoutView.findViewById<View(R.id.tv_dialog_pos)asTextView).visibility=View.GONEdialogLayoutView.findViewById<View(R.id.line).visibility=View.GONE}if(!TextUtils.isEmpty(negativeButtonContent)){(dialogLayoutView.findViewById<View(R.id.tv_dialog_neg)asTextView).text=negativeButtonContentif(negativeButtonListener!=null){(dialogLayoutView.findViewById<View(R.id.tv_dialog_neg)asTextView).setOnClickListener{negativeButtonListener!!.onClick(dialog,-2)}}}else{(dialogLayoutView.findViewById<View(R.id.tv_dialog_neg)asTextView).visibility=View.GONE}/** * 将初始化完整的布局添加到dialog中 */dialog.setContentView(dialogLayoutView)/** * 禁止点击Dialog以外的区域时Dialog消失 */dialog.setCanceledOnTouchOutside(false)val window=dialog.window val context=this.contextasActivity val windowManager=context.windowManager val defaultDisplay=windowManager.defaultDisplay val attributes=window!!.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.attributes=attributesreturndialog}}

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中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 13:13:26

原生PHP网站如何实现从零开始的支付宝支付?

底层原理选择支付宝支付&#xff1a;用户在你的网站上选择商品&#xff0c;并决定使用支付宝进行支付。创建订单&#xff1a;你的网站需要为用户所选的商品创建一个订单&#xff0c;包括商品信息、总价等&#xff0c;并生成一个唯一的订单号。调用支付宝API&#xff1a;你的网站…

作者头像 李华
网站建设 2026/8/27 13:11:42

第265篇 SLAM面试高频题——面试官最爱问的20个SLAM问题

前面将近30篇把SLAM从基础到进阶都过了一遍&#xff0c;从数学原理到具体系统&#xff0c;从传统方法到深度学习。这篇做个收尾&#xff0c;把面试官最爱问的SLAM问题做个汇总。 面试SLAM岗位&#xff08;不管是视觉SLAM还是激光SLAM&#xff09;&#xff0c;面试官的提问思路…

作者头像 李华
网站建设 2026/8/27 13:10:52

UP Board换代Whiskey Lake:AI Core X模块如何重塑工业边缘计算

最早接触 UP Board&#xff0c;还是在第一代 Atom 平台的年代&#xff0c;彼时它在我眼里就是一个“能跑 Windows 的树莓派”。这几年 UP Board 产品线一步步迭代&#xff0c;从 UP Squared 到后来的 UP Xtreme 系列&#xff0c;我注意到它在工业场景里被用得越来越多。最近我又…

作者头像 李华
网站建设 2026/8/27 13:09:58

史上最全Android面试题(带全部答案)2024年最新版

金三银四跳槽季即将来临&#xff0c;今天我们要谈的主题是关于求职。 对于技术人员来说&#xff0c;求职是职业生涯中不可或缺的一部分&#xff0c;而准备一份全面细致的面试题则是减少麻烦的关键。在这个跳槽季&#xff0c;我特意准备了这个系列的文章&#xff0c;一方面是为了…

作者头像 李华
网站建设 2026/8/27 13:09:25

双核MCU架构解析:如何兼得高性能与增强安全

1. 双核 MCU 的架构逻辑&#xff1a;性能与安全为什么能“兼得”这几年做嵌入式项目&#xff0c;明显感觉到双核 MCU 已经不是“旗舰专属”了。随手翻一下主流厂商的产品线&#xff0c;意法半导体的 STM32H7 系列里带双核的型号、恩智浦的 i.MX RT1170、瑞萨的 RA6M5 / RZ 系列…

作者头像 李华
网站建设 2026/8/27 13:04:49

Linux学习10-mysql路由器,redis数据库及codis部署

MySQL路由器实现负载均衡安装MySQL router编辑配置文件手动添加读写&#xff0c;只读端口重启服务sever1上mysql创建新用户&#xff0c;再创建test组sever4连接7001端口三个sever上都安装网络连接查看工具查看负载均衡innoDB Cluster让 MySQL Router自动感知集群内部变化&#…

作者头像 李华