源码篇 | Dialog中写的XML设置宽高为match_parent无效?

是这样的,看官

今天,我在掘金上摸鱼,忽然微信一响(吓劳资一跳,我还觉得我摸鱼被抓了),原来是一朋友问我个问题,问题是在Dialog的布局文件中宽高设置的match_parent不生效面试

既然比较闲,那就一块儿看看源码呗?微信

示例代码函数

为何设置没生效?

是否是Android在哪设置了,致使没生效,仍是手机问题(百试不爽的锅)?布局

从哪里开始看?

你问我从哪里看?看上面的代码,就一个setContentView方法,那就从这里看呗,其实研究过AC源码的,应该知道这个方法的奥妙了,那就当你没看过吧。学习

setContentView

这有三个setContentView方法,很少讲,用哪一个,咱们看哪一个3d

mWindow在哪呢?

咱们须要找这个mWindow,由于能够看到在这调用了setContentView(),而后在这个类中,慢慢找,找啊找 嘻嘻,在Dialog的构造方法找到了 cdn

new了一个PhoneWindow这个类,赋值给了mWindow,那咱们是否是就要到PhoneWindow里面去看setContentView这个函数了?xml

PhoneWindow

在这函数中setContentView也有三个,老规矩,用哪一个看哪一个blog

要是对于陌生的源码,到这就不能跟着入口一直找了,那是否是有什么诀窍呢?诀窍就是你多看点 这源码还算少,一步一步看咯,要是多的话,那就慢慢看。

installDecor()

第一次看源码,确定是无从下手的,可是规范的命令方式,让你懂代码,哈哈,看源码,很好的学习方式哦。get

generateDecor()建立DecorView,DecorView你们能够去了解一下,面试也会问到
generateLayout

一看到这个名字,我就感受很亲切,哈哈, 看到setLayout方法没,看到WRAP_CONTENT, WRAP_CONTENT没,是否是由于设置了这个致使Match_parent不生效,这样分析好像颇有道理,那么问题来了

  • 那就有人问了,那你看到mIsFloating这个值没?
  • 为何这个设置的会致使到咱们XML的设置,他们有啥关系?
mIsFloating

咱们来看看这个值,谁给的?反正默认的是false。我找了好久,发如今Dialog构造方法里面有个默认的Theme,你能够去看看,这里我不贴代码了,你能够在themes.xml里看到!

哈哈哈哈,windowIsFloating 这不是mIsFloating设置吗?嗯嗯,为true,而后她就进去了,而后设置了WRAP_CONTENT, WRAP_CONTENT。

为何这个设置会致使到咱们XML的设置,他们有啥关系?

这个问题咱们就要看生成的mContentParent了,你会发现他在setContentView

懂了吧, mLayoutInflater.inflate(layoutResID, mContentParent) 还不懂吗?就是mContentParent是咱们写的XML的爸爸

小结
  • 设置 false就可以让match_parent生效
  • 自定义设置Dialog的attributes

阅读源码,真的会比较枯燥,可是很打发时间,可是若是阅读源码,不记录点东西,那跟没读同样,好记性不如烂笔头

若是读的不对,要留言给我指出哦,我是个菜鸟,但有好学的心,加油!!!

我有个小花店,我不是来打广告的,看看无妨,这里只是多了个选礼物的地方

相关文章
相关标签/搜索