setContentView整個過程主要是如何把Activity的布局文件或者java的View添加至窗口里,重點概括為:
創建一個DecorView的對象mDecor,該mDecor對象將作為整個應用窗口的根視圖。
依據Feature等style theme創建不同的窗口修飾布局文件,并且通過findViewById獲取Activity布局文件該存放的地方(窗口修飾布局文件中id為content的FrameLayout)。
將Activity的布局文件添加至id為content的FrameLayout內。
當setContentView設置顯示OK以后會回調Activity的onContentChanged方法。Activity的各種View的findViewById()方法等都可以放到該方法中,系統會幫忙回調。
LayoutInflater的使用中重點關注inflate方法的參數含義:
inflate(xmlId, null); 只創建temp的View,然后直接返回temp。
inflate(xmlId, parent); 創建temp的View,然后執行root.addView(temp, params);最后返回root。
inflate(xmlId, parent, false); 創建temp的View,然后執行temp.setLayoutParams(params);然后再返回temp。
inflate(xmlId, parent, true); 創建temp的View,然后執行root.addView(temp, params);最后返回root。
inflate(xmlId, null, false); 只創建temp的View,然后直接返回temp。
inflate(xmlId, null, true); 只創建temp的View,然后直接返回temp。
1,如何理解Activity,View,Window三者之間的關系?
這個問題真的很不好回答。所以這里先來個算是比較恰當的比喻來形容下它們的關系吧。Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)LayoutInflater像剪刀,Xml配置像窗花圖紙。
1:Activity構造的時候會初始化一個Window,準確的說是PhoneWindow。
2:這個PhoneWindow有一個“ViewRoot”,這個“ViewRoot”是一個View或者說ViewGroup,是最初始的根視圖。
3:“ViewRoot”通過addView方法來一個個的添加View。比如TextView,Button等
4:這些View的事件監聽,是由WindowManagerService來接受消息,并且回調Activity函數。比如onClickListener,onKeyDown等。
新聞熱點
疑難解答