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

2,386 阅读3分钟

是这样的,看官

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

既然比较闲,那就一起看看源码呗?

示例代码

为什么设置没生效?

是不是Android在哪设置了,导致没生效,还是手机问题(百试不爽的锅)?

从哪里开始看?

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

setContentView

这有三个setContentView方法,不多讲,用哪个,我们看哪个

mWindow在哪呢?

我们需要找这个mWindow,因为可以看到在这调用了setContentView(),然后在这个类中,慢慢找,找啊找 嘻嘻,在Dialog的构造方法找到了

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

PhoneWindow

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

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

installDecor()

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

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

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

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

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