【參考:http://androidwing.net/index.php/225】
問題:
view是寫在xml里的黑竞,代碼里面setContextView(),其實就是PhoneWindow的setContentView():
view是LayoutInflater解析xml反射出來的疏旨。view的context就是LayoutInflater的mContext:
這個LayoutInflater的context是PhoneWindow傳進去的:
PhoneWindow的context就是Activity的this:
所以很魂,也就是說,一個寫在xml里的View檐涝,他的context就是Activity遏匆。 源碼是這樣告訴我的∷瘢可是為什么4.x都崩了呢榨呆,4.x的view的context到底是什么呢翁逞?
回答:
所有Appcompat的Activity怎爵,創(chuàng)建View的時候悯森,都會對基本View做一個風格的包裝,也就是說ImageView會變成AppcompatImageView巷怜。 那么實際上陵叽,imageView.context 是AppcompatImageView的getContext().
研究發(fā)現(xiàn),AppcompatImageView并沒有重寫getContext()方法丛版,那么到底怎么回事呢,直接看他的構(gòu)造器:
臥槽偏序,坑爹呢這是页畦! 發(fā)現(xiàn)即使context傳進來是個activity,也回被包裝成TintContextWrapper研儒。
那么為什么5.0以上系統(tǒng)豫缨,獲得的還是一個Activity呢?
繼續(xù)看:
nnd端朵,原來如此好芭,看樣子是v7包為了能加載到一些特殊資源,給包裹成了TintContextWrapper冲呢。 所以強轉(zhuǎn)出錯I岚堋!敬拓!