如何更改Dialog的标题与按钮颜色详解
前言
本文主要给大家介绍了如何更改dialog的标题与按钮颜色的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
android.support.v7.app.alertdialog
在这个类中第一行就定义了如下变量:
final alertcontroller malert;
alertdialog的功能的具体实现都在这个alertcontroller内部封装.
修改按钮颜色
1. alertdialog.getbutton
public button getbutton(int whichbutton) { return malert.getbutton(whichbutton); }
这里的参数whichbutton有三种类型:
- dialoginterface.button_positive
- dialoginterface.button_negative
- dialoginterface.button_neutral
传入对应的参数即可得到对应的button
button btnpositive = (button)alertdialog.getbutton(dialoginterface.button_positive); btnpositive.settextcolor(color);
这种方式只能设置按钮的颜色,而无法设置标题颜色
2 alertdialog.getwindow
alertdialog的构造函数如下:
protected alertdialog(@nonnull context context, @styleres int themeresid) { super(context, resolvedialogtheme(context, themeresid)); malert = new alertcontroller(getcontext(), this, getwindow()); }
这里初始化了alertcontroller,并传入了getwindow()
,这个getwindow()
是alertdialog继承自dialog的方法.方法如下:
#dialog.getwindow() public @nullable window getwindow() { return mwindow; }
将这个window对象传入alertcontroller后,在alertcontroller源码中可以看到对话框标题和按钮的id,并通过window.findviewbyid(id)
获取对应的view.
所以这里可以这样得到对话框的标题和按钮:
//标题 textview tvtitle = (textview)alertdialog.getwindow().findviewbyid(r.id.alerttitle); //按钮 button btnpositive = (button)alertdialog.getwindow().findviewbyid(r.id.button1);
然后设置所需要的颜色就可以了.这种方法可以修改dialog的所有设置了id的控件的字体颜色.
3 反射
3.1 首先拿到alertcontroller对象
field malert = alertdialog.class.getdeclaredfield("malert"); malert.setaccessible(true); object controller = malert.get(dialog);
在alertcontroller内部查找到需要更改字体颜色的标题和按钮
button mbuttonpositive; button mbuttonnegative; button mbuttonneutral; private textview mtitleview; private textview mmessageview;
然后通过反射获取对应控件,修改控件颜色即可
field mtitleview = controller.getclass().getdeclaredfield("mtitleview"); mtitleview.setaccessible(true); textview tvtitle = (textview) mtitleview.get(controller); tvtitle.settextcolor(color.green);//更改标题的颜色
三种方式比较起来,第二种是最简单,效率也是最高的
更改dialog显示的位置
window window = dialog.getwindow(); windowmanager.layoutparams lp = window.getattributes(); lp.gravity = gravity.bottom; lp.x = 100; lp.y = 100; window.setattributes(lp);
这里要注意的是,windowmanager.layoutparams
的x和y坐标,看源码注释如下:
/** * x position for this window. with the default gravity it is ignored. * when using {@link gravity#left} or {@link gravity#start} or {@link gravity#right} or * {@link gravity#end} it provides an offset from the given edge. */ @viewdebug.exportedproperty public int x; /** * y position for this window. with the default gravity it is ignored. * when using {@link gravity#top} or {@link gravity#bottom} it provides * an offset from the given edge. */ @viewdebug.exportedproperty public int y;
如果lp.gravity是默认的,那么x和y即使设置了也是无效的.因此x和y需要和lp.gravity
搭配使用才有效果.当然lp.gravity
也可以单独使用.
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读