Android本身封装的AlertDialog.Builder很方便易用,但如果想要自定义弹出对话框的风格,如标题字体背景元素间隔之类的,那就比较困难了。

最近我就遇到了这个问题,一个工程的界面风格全改成蓝白色了,自然客户希望对话框也是蓝白色的,同时字体也有变化。但安卓自带对话框默认是黑白的,不同手机厂商定制的ROM显示的对话框各不相同,但基本上都是黑白风格。

程序里所有对话框都是用AlertDialog.Builder创建的,因此一开始我想到的解决办法是继承AlertDialog.Builder,做好几个固定的布局模板,然后在根据需要创建自己的对话框。但程序里弹对话框的地方太多了,粗略查找一下有一百多个,每个的写法都不太相同——有的有标题有的没有,有的有一个按钮有的有两个或三个,有的是消息有的是列表,有的是单选有的是输入框,有的按钮有事件,有的是列表项有事件,甚至还有键盘取消事件什么的。这些东西一个个遍历下来估计得准备几十个模板。

继承行不通,于是就想着改主题样式。上网查知AlertDialog支持自定义样式,就是new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom))的方式,然后在styles.xml里自定义主题风格(

确实是支持,但是不幸的是,在3.0以前谷歌实现得不好,是有问题的,字体样式无法应用到对话框样式里。要想实现标题和消息字体的自定义,则需要实现自己的Builder,用自己创建的TextView替换原有的。这个老外也做了工作:http://blog.stylingandroid.com/archives/280。

本来嘛,到此为止,对话框的自定义工作已经差不多了。但要命的是,客户界面上还要改按钮风格,还是改列表项的显示...这下就真烦人了,难道我还一个个去创建自定义布局?客户什么都可能做得出,看来我需要真正完全自定义才行。

于是我研究了一下AlertDialog的源码(2.2),发现它其实是三个类:AlertDialog, Builder和AlertController,其中核心代码都在AlertController里,但要命的是AlertController是不公开的无法继承。一不做二不休我把这三个类的代码全拷出来,重命名,把它们用到的layout、drawable也拷出来全改了一遍,等于完全重新实现了一个自己对话框,不过基本上大部分业务逻辑还是一样的。然后我直接修改layout实现我想要的效果,这时所有东西都由我控制,改背景颜色加元素写事件代码都不在话下了。

最后,在工程里查找替换,把原先用new AlertDialog.Builder(ctx)创建对话框的代码,全部替换成我写的new HuzAlertDialog.Builder(ctx),大功告成。

为方便大家少走弯路,我把三种样式的代码整理成一个DEMO传上来了,运行效果如图:

Android自定义一个对话框,完全自定义Android对话框AlertDialog的实现相关推荐

  1. android 编程一个程序实现方法,Android中一个应用实现多个图标的几种方式

    前言 最近因为新需求需要,我的应用将有多个ICON入口..最终选择了 activity-alias,其实实现多图标有好几种方式,下面就给大家总结下,分享出来供大家参考学习: 1. 多Activity ...

  2. android获得一个view的高度,Android ViewTreeObserver使用总结及获得View高度的几种方法...

    ViewTreeObserver 注册一个观察者来监听视图树,当视图树的布局.视图树的焦点.视图树将要绘制.视图树滚动等发生改变时,ViewTreeObserver都会收到通知,ViewTreeObs ...

  3. android rxbus 一个页面监听,Android RxBus的使用

    RxBus的核心功能是基于Rxjava的,在RxJava中有个Subject类,它继承Observable类,同时实现了Observer接口,因此Subject可以同时担当订阅者和被订阅者的角色,这里 ...

  4. 自定义一个虚拟机+将自定义的虚拟机创建成模板机+快速创建虚拟机

    自定义虚拟机: 配置网络yum源 安装虚拟机: [root@room9pc01 images]# virt-manager cd /var/lib/libvirt/images/ qemu-img c ...

  5. mysql怎么自定义一个函数调用_MySQL自定义函数编写

    需求:对于数据库中的记录,如果有两条连续的数据的value字段的值相同,则发邮件通知相关人员. 需求分析:告警系统里面的告警检查是通过SQL来进行的,一般的SQL实现不了此功能,因此,这里可以通过函数 ...

  6. android的颜色渐变动画效果图,Android简单实现一个颜色渐变的ProgressBar

    今天看一个教程,看到一个颜色渐变的ProgressBar,觉得有点意思,所以记录一番. 下面这个是效果图 颜色渐变的ProgressBar 看到效果图可能会给人一种使用了高端技术的感觉,其实这个没有那 ...

  7. android 实现一个图片的闪烁

    android 实现一个图片的闪烁 android 实现一个图片的闪烁 android 实现一个图片的闪烁 直接上代码 //实现图片闪烁效果 private void setFlickerAnimat ...

  8. android 单选框 icon,Android中的普通对话框、单选对话框、多选对话框、带Icon的对话框、以及自定义Adapter和自定义View对话框详解...

    标签: 对话框就是一个AlertDialog,但是一个简单的AlertDialog,我们却可以将它玩出许多花样来,下面我们就来一起总结一下AlertDialog的用法.看看各位童鞋在平时的工作中否都用 ...

  9. android自定义对话框_Android自定义提醒对话框

    android自定义对话框 In this tutorial, we'll be discussing and implementing Custom Alert Dialogs in our And ...

最新文章

  1. 待续未完- 自己写后台内容管理程序 - 完全手写不用框架的
  2. 从《在小吃店遇见凯恩斯》初识经济
  3. Struts2中ValueStack结构和总结
  4. python123课后作业嵩天_MOOC嵩天《Python语言程序设计》Python123课后作业4
  5. 科学计算机怎么表示大括号,电脑上大括号怎么拉长
  6. 台式计算机显卡驱动位置,台式电脑独立显卡怎么安装驱动的
  7. D3.js学习笔记七:多系列折线图与图例
  8. ad怎么查接线_Altium怎么进行线路的开路检查?
  9. ChromeFK插件推荐系列九:PDF插件推荐
  10. 硬件电路|PMOS开关电路
  11. 利用神经网络预测股票价格走势
  12. IO流实现写入规定的acci码值
  13. 微信开发 免费服务器,微信开发详解:[1]免费服务器
  14. KAPPA领衔实施服装ERP软件树立行业榜样
  15. 8*8LED点阵图原理(74HC595芯片使用方法)
  16. Google Filament 源码学习(二):Material System (一)
  17. windows服务器怎么查看网站,windows运行查看服务器
  18. APP热潮来临 图解九种商业模式
  19. C++ Builder 初学指南
  20. android 使用内容提供者获取手机联系人

热门文章

  1. 计算机二级证书含金量有多高?你真的知道吗?
  2. iis6.0站点打不开,找不到服务器或 DNS 错误。非分页缓冲池内存不足故障一例...
  3. 爆笑三国故事:张飞流水帐31-40
  4. 零知识证明:安全定义
  5. 【全网最全的博客美化系列教程】05.公告栏个性时间显示的实现
  6. 客户退货服务新方案之技术对接教程
  7. Visual Studio 2015发布以及ASP.NET 5路线图
  8. last 命令 – 显示用户历史登录情况
  9. 身份证名字转四六级成绩爬虫
  10. c语言求摸球游戏,Play In The Dark——走近视觉障碍玩家的世界