標籤:
有的時候,我們配置好的布局檔案,在載入完成添加到我們的Activity中後發現,並沒有安裝我們設定的屬性
來布局,比為我們設定了android:layout_marginTop="100dip",但是運行程式後發現一點作用都沒有,相似的還有layout_height等以android:layout_開頭的屬性設定都沒有作用,這類問題以我們使用Adapter的作為資料來源的時候作用居多,因為Adapter裡有一個方法是getView,這個返回的VIew是一個從XML布局裡載入的,一般如下:
Java代碼
- if(convertView==null){
- convertView=LayoutInflater.from(mContext).inflate(R.layout.main, null);
- }
- return convertView;
問題恰恰出在我們的LayoutInflater.from(mContext).inflate(R.layout.main, null);這句代碼上,在使用inflate的時候,如果第二個參數(View root)為null,那麼將不會載入你的布局檔案裡的最頂層的那個布局節點的布局相關配置(就是以android:layout_開頭的屬性)..我們可以看下該方法的實現來說明一下,通過尋找原始碼,inflate的實現都在這個public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) 方法裡定義。。其中一段:Java代碼
- if (root != null) {
- if (DEBUG) {
- System.out.println("Creating params from root: " +
- root);
- }
- // Create layout params that match root, if supplied
- params = root.generateLayoutParams(attrs);
- if (!attachToRoot) {
- // Set the layout params for temp if we are not
- // attaching. (If we are, we use addView, below)
- temp.setLayoutParams(params);
- }
- }
可以看到,當root為null的時候是不會執行params = root.generateLayoutParams(attrs);這段代碼的,這段代碼就是把xml裡的布局配置轉為LayoutParams,換句說就是載入我們配置的布局屬性,以供布局類(FrameLayout等)在onLayout的時候控制View的大小、位置、對齊等等。。以FrameLayout為例,看下它的generateLayoutParams(attrs)方法。Java代碼
- public LayoutParams generateLayoutParams(AttributeSet attrs) {
- return new FrameLayout.LayoutParams(getContext(), attrs);
- }
很簡單,構造了一個FrameLayout.LayoutParams類,該類整合了MarginParams,增加了一個gravity對其的屬性配置。。。 在這裡,如果要自訂自己的VIewroup,並且該ViewGroup有一些自訂控制布局的屬性設定,就可以通過整合View.MarginParams來擴充布局配置,然後重寫generateLayoutParams方法,這樣系統架構就會自動使用該布局讀取我們在xml中配置的布局屬性來控制我們的VIew的位置。。 基於以上分析,我們在使用LayoutInflate的inflate方法的時候一定要保證root參數不能為null,其實這個root就是父View的意思,就是說你把xml轉換為一個VIew的時候,該VIew的Parent是root,如果你不想把該View添加到該root裡,那麼讓第三個參數 attachToRoot為false,如果要添加則為true. 說到這個問題了,其實還有一些布局,他們的參數配置要滿足一定的條件才會起作用,比如FrameLayout裡的View,你要想它的leftMargin生效,必須指定它的layout_gravity為left,同理right對應rightMargin.top和bottom也一樣。。在使用時注意即可,多看看原始碼。要不然就會莫名起名,不知道哪裡的問題。ViewGroup的三條線onMeasure 測量View的大小onLayout 對View的布局進行控制draw繪製該View,drawChild繪製子VIew
Android Layout布局檔案裡的android:layout_height等屬性不起作用