Android布局之weight屬性解析

2021-06-19 04:35:40 字數 4709 閱讀 6097

在網上看了一些對layout_weight的講解,有些說的比較片面,只列舉了一種情況,然後自己通過實驗和一些比較好的文章總結了一下,特此記錄下來,以備以後所用。layout_weight是線性布局,也就是linearlayout裡面用到的,下面通過實驗來看這個layout_weight的特性。

1.當控制項的屬性

android:layout_width="fill_parent"時,布局檔案如下:

xml**

<?xmlversion="1.0"

encoding="utf-8"?>

xmlns:android=""

android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_weight="1"

android:text="button1"/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_weight="2"

android:text="button2"/>

在這裡button1的layout_weight=1,buttong2的layout_weight=2,執行效果為:

我們看到,button1佔了2/3,button2佔了1/3。如果此時把button2的weight設定成2000,不是說button2就消失了,而是button1的寬度幾乎佔滿了螢幕寬度,而螢幕最後一絲細條則是留給button2的,已近非常小了,沒有顯示出來。截圖如下:

得出結論:在layout_width設定為fill_parent的時候,layout_weight代表的是你的控制項要優先盡可能的大,但盡可能大是有限度的,即fill_parent.

2.當控制項的屬性

android:layout_width="wrap_content"時,布局檔案如下:

xml**

<?xmlversion="1.0"

encoding="utf-8"?>

xmlns:android=""

android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1"

android:text="button1"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="2"

android:text="button2"/>

同樣,button1的weight設定為1,button2的weight設定為2,但是效果與fill_parent的效果截然相反。執行效果如下:

這時,和fill_parent正好相反,button1的寬度佔據了螢幕寬度的1/3,而button2的寬度佔據了螢幕的2/3,如果此時把button1的weight設定為2000,按照之前理解,button1應該小的幾乎在螢幕上看不到,但是錯了,實驗告訴我們,當button1的weight非常小時,也要"wrap_content",也就是要保證button1至少能夠顯示。以下是button1設定weight為2000時的執行截圖:

我們看到,button1已經足夠小,但是要保證他能顯示出來,因此得出結論:

linearlayout

中包含有

weight

的child

時,linearlayout

會measure

兩次:設螢幕寬度為

x第一次

:button1

的measuredwidth

為x,button2

也為x (

因為用了

weight,

所以linearlayout

每次measure child

時不考慮前乙個已經占用的大小),

total_width為2x

第二次:計算

delta=x-total_width=-x,

然後會將

button1

的寬度設為

x+delta*1/3=0.66x, button2

的寬度為

x+delta*2/3=0.33x

那我現在對這句話重新概括一下:「因為設定了button1的權重最小,所以它占用的布局優先順序就越高」,也許在android裡面布局並沒有優先順序之說,我這裡只是為了說明問題,自己定義的,所以朋友們不要拍磚。     

那首先分析一下當layout_width屬性設定為fill_parent的時候,即充滿父布局,當然意思是這個控制項要根據weight的設定盡可能的大,因此,依上例而論,button1的weight設為1,button2的weight設定為2.即button的優先順序最高,因此,要填充父布局就要button1先來填充,盡可能的大,那這個盡可能又是多少呢,這就要綜合layout裡其他控制項的weight值了,然後做一下運算,button1佔據2/3,button2佔據1/3.你也可以把button2設定為乙個非常大的數,比如2000,此時在graphical layout模式下可以看到button1填充滿了整個寬度,而看不到button2的影子,事實上button2還是存在的,你把滑鼠指向button1的後面就可以看到乙個長長的豎條,那個就是button2,已經非常非常小了。因此,在

layout_width

設定為fill_parent

的時候,weight

所代表的是你的控制項要優先盡可能的大。

接著是當layout_weight設定為wrap_content的時候,即適應內容的寬度,意思是這個控制項要盡可能的小,只要能把內容顯示出來就可以了,同樣的,如果把button1和button2的layout_weight設定為wrap_content後,button1的weight為1,button2的weight為2.那麼button1要優先盡可能的小,而button2也要盡可能的小,只是優先順序不一樣,因為設定了weight,所以這兩個控制項總的寬度要填滿父布局的寬度,所以就又要計算每個控制項所佔據的大小,此時,button1的優先順序較高,共有兩份,乙份1/3,乙份2/3,button1要盡可能的小,那button1當然要選1/3,因此,我們看到的效果反而是button2佔據的較大。這裡要說的是如果把權值同樣做如下設定:button1為1,button2為2000,那button1是不是就要佔據1/2000的空間呢?這麼理解就錯了,剛才說了,

要盡可能的小

,但這個小是有乙個限度的

,那就是

wrap_content,

就是還要是內容完完整整的顯示出來

,同樣的

,盡可能的大也是有乙個限度的

,那就是父布局的寬度。因此,在

layout_width

設定為wrap_content

的時候,weight

所代表的是你的控制項要優先盡可能的大。

所以,要對weight做了解,要深深的理解下面兩句話:

所以,要對

weight

做了解在

layout_width

設定為fill_parent

的時候,layout_weight

所代表的是你的控制項要優先盡可能的大

,但這個大是有限度的,即

fill_parent.

在layout_width

設定為wrap_content

的時候,layout_weight

所代表的是你的控制項要優先盡可能的小

,但這個小是有限度的,即

wrap_content.

Android回顧之布局

前面回顧了四大元件,今天我們來回顧一下android的布局方式 linearlayout可以說是最常用到的布局方式了。linearlayout是按照水平或是垂直的方式排列元素,垂直布局 android orientation vertical 和水平布局 android orientation ho...

android筆記之布局

三個屬性都用來適應檢視的水平或垂直大小,乙個以檢視的內容或尺寸為基礎的布局比精確地指定檢視範圍更加方便。1 fill parent 設定乙個構件的布局為fill parent將強制性地使構件擴充套件,以填充布局單元內盡可能多的空間。這跟windows控制項的dockstyle屬性大體一致。設定乙個頂...

Android之重新整理布局

學習安卓的高階技巧,其中的自定義view是必備課程。目前在研究該方面的東西,能用 畫出東西真令人興奮!以下是常見繪製後重新整理布局的方法及其區別特點。請求重繪view樹,即draw 過程。整個重新整理ui,並且從頭到尾並不會觸發onmeasure 方法 控制大小用 如果是view就重繪view,如果...