转载前请标明出处:http://blog.csdn.net/sahadev_
先上一下示例图:
这是默认状态下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1DOsRGbSdVWvZkMjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TM4cTMyMzM5ADMxYDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
这是通过反射后修改的结果:
在解决这个问题之前首先需要了解一下AlertDialog的基本构造,所以先从源码看起:
想要知道为什么显示不全,首先入口处应该是这里:
然后进入setTitle的方法:
好了,它把字符串赋给了对象P,然后再来看看P的类型:
好了,进入AlertController.AlertParams类内可以看到该类是属于AlertController的内部类,以下为该类的部分属性:
好了,所以那个字符串设置时最终会设置到这个类对象的mTitle处,然后接下来就是要查看这个属性什么时候被使用了呢:
在内类可以看到该方法使用了该属性:
这里说明mTitle被设置给了AlertController的对象dialog,然后接下来就是寻找这个dialog对象是怎么被传入进来的:
通过寻找找到apply该方法的被调用处是:
该方法位于AlertDialog.Builder的内部,也就是当Builder对象调用create方法时会将AlertController的对象dialog传入,这里可以看到是dialog的mAlert属性,也就是说dialog的mAlert属性是AlertController的对象。好了,到这里分析完毕。现在就剩下取出该对象,对该对象进行反射了。
好了,到了这里就解决完毕了。
如有问题请留言。