源碼篇 | 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

閱讀源碼,真的會比較枯燥,可是很打發時間,可是若是閱讀源碼,不記錄點東西,那跟沒讀同樣,好記性不如爛筆頭

若是讀的不對,要留言給我指出哦,我是個菜鳥,但有好學的心,加油!!!

我有個小花店,我不是來打廣告的,看看無妨,這裏只是多了個選禮物的地方

相關文章
相關標籤/搜索