修改AlertDialog各组件颜色、字体等属性

像下图这种Dialog该怎么实现呢?


乍一看视觉效果还可以,但当我们想改变一下标题的文字颜色或者按钮颜色应该怎么做呢?

查看源码

public class AlertDialog extends Dialog implements DialogInterface {private AlertController mAlert;......
}

AlertDialog类中并没有直接定义控件,而是通过AlertController类来设置各控件的属性。 
然而在android studio中无法直接查看该类源码,因为部分源码的标签是@hide的,即使文件存在但编辑器也不会显示,所以需要通过另外的软件来查看源码。

这里我使用了Source Insight,大家可从此处下载:Source Insight 4.0 最简单的破解安装

Source Insight的使用教程:使用 Source InSight 阅读 Android 源码

有条件的朋友还可以在AndroidXRef网站上直接查看,里面有各个版本的Android源码,但我因为访问速度太慢就没用这个看。

回到正题,在AlertController类中,可以看到以下变量:

class AlertController {......private ImageView mIconView;private TextView mTitleView;private TextView mMessageView;private View mCustomTitleView;......
}

但由于我们无法直接访问这些变量,回想起上学期学习的高级Java,其中学到的反射机制终于可以派上用场了!

修改文字颜色、大小

 AlertDialog dialog = new AlertDialog.Builder(this).setTitle("标题").setMessage("内容").setPositiveButton("确定",null).setNegativeButton("取消",null).create();dialog.show();try {Field mAlert = AlertDialog.class.getDeclaredField("mAlert");mAlert.setAccessible(true);Object mAlertController = mAlert.get(dialog);Field mMessage = mAlertController.getClass().getDeclaredField("mMessageView");mMessage.setAccessible(true);TextView mMessageView = (TextView) mMessage.get(mAlertController);mMessageView.setTextColor(你要设置的颜色);mTitleView.setTextSize(你要设置的文字大小);Field mTitle = mAlertController.getClass().getDeclaredField("mTitleView");mTitle.setAccessible(true);TextView mTitleView = (TextView) mTitle.get(mAlertController);mTitleView.setTextColor(你要设置的颜色);mTitleView.setTextSize(你要设置的文字大小);} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}

修改按钮颜色 
同样,我们可以通过反射机制修改,也可以直接使用AlertDialog类中提供的方法:

/*** Gets one of the buttons used in the dialog. Returns null if the specified* button does not exist or the dialog has not yet been fully created (for* example, via {@link #show()} or {@link #create()}).** @param whichButton The identifier of the button that should be returned.*            For example, this can be*            {@link DialogInterface#BUTTON_POSITIVE}.* @return The button from the dialog, or null if a button does not exist.*/public Button getButton(int whichButton) {return mAlert.getButton(whichButton);}AlertDialog dialog = new AlertDialog.Builder(this).setTitle("标题").setMessage("内容").setPositiveButton("确定",null).setNegativeButton("取消",null).create();dialog.show();dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(你要设置的颜色);dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextSize(你要设置的文字大小);

附上一张修改后的效果图:

至此,我们就可以用反射机制修改Dialog中各控件的各个属性(又如gravity等,但经过实践发现Title无法设置Gravity属性???Message却又可以???暂留一个未解之谜),需要用到的时候再探索就好了。

注意

反射方法必须在dialog.show()方法后执行,不然会报错。

禁止返回键、外框不消失

android 如何让dialog不消失,即使是用户按了返回键dialog也不消失
解决的问题:软件提示升级的dialog时候,用户有可能按了返回键,但是现在的需求是用户只能按“确定升级”或者“暂时不升级”这两个按钮才能拿dialog消失,按返回键不能使dialog消失 
方案:截取activity的 onkeydown事件,而应该截取dialog的key响应事件,当dialog在前台显示的时候,keylistener首先会派发到dialog里面,在那里面监听就行了。
先申明一个keylistener。

    OnKeyListener keylistener = new DialogInterface.OnKeyListener(){public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {if (keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0){return true;}else{return false;}}} ;

在把这个listener注册到dialog里面去 当初始化dialog的时候

                builder.setTitle(getText(R.string.XXXX)).setMessage(getText(R.XXXXXX)).setOnKeyListener(key).setCancelable(false).setPositiveButton(android.R.string.ok, someOKButtonListener).setNegativeButton(android.R.string.cancel, null);

PS: setCancelable(false),作用是当dialog弹出来的时候,如果触点在dialog外围,按照默认的方式 dialog将消失。如果这个设为false的话 这种情况dialog就不会消失了。  加了这一句就OK了。dialog.setCancelable(false);

今天遇到一个问题,如图所示:


    
这个Dialog偏右,在模拟器以及9.0一下的手机上都是正常显示,修复了一下这个小BUG
我们可以设置一下它的宽度,按照屏幕占比去计算。我的Demo设置了他的宽度为屏幕的95%,注意:设置属性的代码要放到show()方法之后,要不然可能会出现设置的属性不生效问题
具体代码如下:

AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setTitle("网络异常");builder.setMessage("检测到您的网络断开连接,请检查网络是否连接正常!");builder.setCancelable(false);builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {ActivityCollector.finishAll();Intent intent = new Intent(context,SplashActivity.class);context.startActivity(intent);}});AlertDialog dialog = builder.create();dialog.show();//放在show()之后,不然有些属性是没有效果的,比如height和widthWindow dialogWindow = dialog.getWindow();WindowManager m = getWindowManager();Display d = m.getDefaultDisplay(); // 获取屏幕宽、高WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值// 设置宽度p.width = (int) (d.getWidth() * 0.95); // 宽度设置为屏幕的0.95p.gravity = Gravity.CENTER;//设置位置//p.alpha = 0.8f;//设置透明度dialogWindow.setAttributes(p);

Android9.0 AlertDialog不居中显示问题解决

参考文章原文链接:

https://blog.csdn.net/m0_38025747/article/details/80217116

https://www.cnblogs.com/ldq2016/p/6026490.html

https://blog.csdn.net/qq_38356174/article/details/87856639

修改AlertDialog各组件颜色、字体等属性、禁止返回键、外框不消失、android9.0不居中显示问题解决相关推荐

  1. Android 10.0状态栏居中显示时间和修改时间显示样式

    1.概述 状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局 ...

  2. AlertDialog禁止返回键

    android 如何让dialog不消失,即使是用户按了返回键dialog也不消失 解决的问题:软件提示升级的dialog时候,用户有可能按了返回键,但是现在的需求是用户只能按"确定升级&q ...

  3. CSS的基础概念、行内样式(内嵌样式)、内部样式(内联样式)、外部样式(外联样式)、字体相关属性及相关练习的案例

    CSS学习笔记 CSS的基本概念 Cascading Style Sheet层叠样式表 标签:<p> <div>-之类的标签 使用方式:直接输入标签名 类(class):cla ...

  4. UIAlertController 简单修改title以及按钮的字体颜色

    https://www.jianshu.com/p/cecd1b4bbf27 欢迎加入 iOS开发QQ群:151133690 实现此效果的另一种简单调用方式已经上传到gitHub,请移步https:/ ...

  5. matlab常用的设置,坐标系、线条颜色、线型,字体、属性

    一.坐标系 1)定义坐标范围:一般MATLAB自动定义坐标范 围,如用户认为设定的不合适,可用:axis([Xmin, Xmax, Ymin, Ymax]) 来重新设定; 2) 坐标轴控制:MATLA ...

  6. Snackbar的显示位置以及字体颜色字体大小背景修改

    前言 修改Snackbar的位置操作需要父布局是FrameLayout或者CoordinatorLayout 其他布局无效,需要使用其他开源的了. 代码 Snackbar snackbar = Sna ...

  7. dw更改外接样式表html,dw如何单独改字体颜色 DW怎么修改单个链接文字颜色?

    在DW中如何改变CSS中的字体大小和颜色? 首先,打开html编辑器,新建html文件,例如:index.html. 在index.html中的标签中,输入css代码: div{background- ...

  8. vue组件中的样式属性:scoped,解决在父组件中无法修改子组件样式问题

    Scoped CSS规范是Web组件产生不污染其他组件,也不被其他组件污染的CSS规范. vue组件中的style标签标有scoped属性时表明style里的css样式只适用于当前组件元素,它是通过使 ...

  9. ubuntu16.04 xfce4的鼠标主题设置为oxygen-red、修改文件夹背景颜色、两处系统字体设置、右键菜单添加压缩解压选项

    安装 oxygen-cursor-theme oxygen-cursor-theme-extra 然后 设置=>鼠标和触摸板 如果是自定义鼠标主题,那么把主题文件解压后拷贝到: /usr/sha ...

最新文章

  1. 洛谷 P1966 火柴排队
  2. 【python教程入门学习】利用Python绘制关系网络图
  3. MySQL Order by 语句用法与优化详解
  4. 16 开机自动登录脚本_创建计划任务自动运行程序---运维无人值守
  5. 08-CSS基础-体验CSS
  6. android viewpager 底部tabhost,FragmentTabHost+ViewPager实现底部导航栏
  7. php 时分秒选择联动,微信小程序-年月日时分秒六级联动时间选择器
  8. FPGA设计者的5项基本功
  9. bootstarp js设置列隐藏_bootstrap table getHiddenColumns获取隐藏的列的方法
  10. thinkPHP 数据库操作和分页类
  11. 使用Flink集群环境进行数据处理
  12. CSS选择器的种类使用
  13. 模糊搜索cell效果
  14. 华为手机耳机sws音效是什么_耳机sws音效是什么 华为手机耳机sws音效是什么
  15. nodejs中art-template模板语法冲突解决方案
  16. PHP WebShell 免杀
  17. 职称计算机为啥要现场拍照,网上确认/现场确认的照片还没拍?你需要这份拍照攻略!...
  18. netty:Failed to initialize a channel. Closing
  19. 骗的就是你!揭露买本10大愚蠢表现
  20. 微信JSSDK invalid signature签名错误的解决方法

热门文章

  1. Winform窗体学习笔记 第七篇 TextBox类
  2. 个税专项附加扣除操作指引
  3. linux 2.6.23时钟中断与调度分析,进程调度Linux内核分析ppt课件
  4. 【maya】【材质】高精度花纹制作
  5. 红黑树HashSetMap
  6. 2019最近计算机毕业设计-题目汇总大全-系列1
  7. ckeditor5 html 插件,ckeditor5文本对齐插件无法正常工作
  8. 提升品牌形象为品牌正名,COMMUNE获胜诉
  9. 前端加载大图片从模糊到清晰
  10. 祖鲁法则.mobi下载