一直以來對android:layout_weight 屬性的理解停留在對其相對于的View按權(quán)重(或者說是比例)平分的概念中,因為之前學(xué)習(xí)時看的書上就是這么講的政勃。最近才發(fā)現(xiàn)原來不僅僅是按權(quán)重平分那么簡單(真是坑爹教材坑死人安珊小)旧乞,嚴(yán)格的說法應(yīng)該是對當(dāng)前剩余空間按權(quán)重平分。
初探##
日常開發(fā)中磅氨,在LinearLayout中使用layout_weight可以很好的應(yīng)對那些內(nèi)容會動態(tài)變化的布局結(jié)構(gòu)尺栖。比如表單填寫,最常見的就是注冊登錄頁面布局內(nèi)容的實現(xiàn)烦租,例如要實現(xiàn)下圖布局
可用如下方式實現(xiàn)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_marginTop="10dp"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:padding="8dp"
android:layout_width="0dp"
android:layout_weight="1.5"
android:layout_height="wrap_content"
android:text="用戶名"
android:gravity="center"
android:id="@+id/textView2" />
<EditText
android:padding="8dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:text=""
android:ems="10"
android:id="@+id/editText"
android:layout_weight="3" />
</LinearLayout>
<LinearLayout
android:layout_marginTop="10dp"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:padding="8dp"
android:layout_width="0dp"
android:layout_weight="1.5"
android:layout_height="wrap_content"
android:text="密碼"
android:gravity="center"
/>
<EditText
android:padding="8dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:text=""
android:ems="10"
android:layout_weight="3" />
</LinearLayout>
<LinearLayout
android:layout_marginTop="10dp"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:padding="8dp"
android:layout_width="0dp"
android:layout_weight="1.5"
android:layout_height="wrap_content"
android:text="確認(rèn)密碼"
android:gravity="center"
/>
<EditText
android:padding="8dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:text=""
android:ems="10"
android:layout_weight="3" />
</LinearLayout>
</LinearLayout>
這里使TextView和EditText的寬度為0耐亏,讓后使其權(quán)重分別為1.5和3筒繁,這樣整體效果會看起來比較整齊味混,當(dāng)然用RelativeLayout也是能實現(xiàn)的眼姐,但是這樣更簡單一些,也更高效窃祝。
進階##
在Android沒有推出android-percent-support-lib之前屡贺,甚至在其推出后,一直使用layout_weight實現(xiàn)“百分比”布局锌杀。相比于wrap_content和match_parent ,巧妙的使用layout_weight可以很簡潔的實現(xiàn)界面按“百分比”布局,當(dāng)然這其中也有一些奧妙泻仙,這里就做一下記錄糕再。
首先看一下下面的布局文件
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#77bc1f"
android:text="AAA"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="#06d992"
android:text="BBB"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3"
android:background="#EEA32E"
android:text="CCC"
android:textColor="#fff"
android:textSize="23sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#77bc1f"
android:text="AAA"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="#06d992"
android:text="BBB"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:background="#EEA32E"
android:text="CCC"
android:textColor="#fff"
android:textSize="23sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#77bc1f"
android:text="AAA"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="#06d992"
android:text="BBB"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:background="#EEA32E"
android:text="CCC"
android:textColor="#fff"
android:textSize="23sp" />
</LinearLayout>
</LinearLayout>
這段代碼實現(xiàn)的UI效果如下:
整個布局是個垂直的LinearLayout,里面有三個水平方向的LinearLayout玉转,內(nèi)部放置了三個TextView突想,三個TextView高度為wrap_content;其內(nèi)容和背景色也不同(這里只是為了看起來方便)究抓,重點是其寬度:
- 第一行內(nèi)三個TextView
layout_width="wrap_content"
- 第二行內(nèi)三個TextView
android:layout_width="match_parent"
- 第三行內(nèi)三個TextView
android:layout_width="0dp"
而每一個LinearLayout內(nèi)部三個TextView的layout_weight分別1猾担,2,3刺下。由此绑嘹,看見由于其wrap_content的不同,使其layout_weight的分配受到了影響橘茉。這里就來分析一下工腋,按照之前所說,layout_weight會按屏幕剩余空間畅卓,按權(quán)重分配空間擅腰。
- 第一種情況(第一個LinearLayout)
系統(tǒng)先給3個TextView分配他們的寬度值wrap_content(寬度足以包含他們的內(nèi)容1,2,3即可),然后會把剩下來的屏幕空間按照1:2:3的比列分配給3個textview翁潘,
上面的UI 比重為 :
61/6 趁冈,62/6,6*3/6 即1:2:3 拜马,如UI 第一行呈現(xiàn)的那樣渗勘。
- 第二種情況(第二個LinearLayout)
系統(tǒng)先給3個textview分配他們所要的寬度match_parent沐绒,也就是說每一都是填滿他的父控件,這里就是屏幕的寬度
那么這時候的剩余空間=
1個parent_width-3個parent_width=-2個parent_width (parent_width指的是屏幕寬度 )
那么第一個TextView的實際所占寬度應(yīng)該=match_parent的寬度,
即parent_width + 他所占剩余空間的權(quán)重比列1/6 * 剩余空間大醒叫稀(-2 parent_width)=2/3parent_width
同理第二個TextView的實際所占寬度=parent_width + 2/6*(-2parent_width)=1/3parent_width;
第三個TextView的實際所占寬度=parent_width + 3/6*(-2parent_width)=0parent_width洒沦;所以就是2:1:0的比列顯示了。
即如UI第二行呈現(xiàn)的那樣价淌。
- 第三種情況
這種情況申眼,其實和第一種是一樣的。
看到這里蝉衣,下次使用layout_weight時括尸,如果放置的控件看不見了,就不會覺得奇怪了病毡。
舉一反三##
好了濒翻,接下來想想,如果把上面代碼里三個TextView的權(quán)重依次改為3啦膜,2有送,1 又會是一種怎樣的UI效果呢,想好了僧家,看下面代碼和實際效果圖雀摘。
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#FF424242"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3"
android:background="#77bc1f"
android:text="AAA"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="#06d992"
android:text="BBB"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#EEA32E"
android:text="CCC"
android:textColor="#fff"
android:textSize="23sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:background="#77bc1f"
android:text="AAA"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="#06d992"
android:text="BBB"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#EEA32E"
android:text="CCC"
android:textColor="#fff"
android:textSize="23sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:background="#77bc1f"
android:text="AAA"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="#06d992"
android:text="BBB"
android:textColor="#fff"
android:textSize="23sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#EEA32E"
android:text="CCC"
android:textColor="#fff"
android:textSize="23sp" />
</LinearLayout>
</LinearLayout>
應(yīng)該和你想的一樣吧。
好了八拱,這里就是對android:layout_weight的學(xué)習(xí)筆記阵赠,雖然是一個很簡單的屬性,但是巧妙的設(shè)置后肌稻,很方便的實現(xiàn)一些布局清蚀。
ps:markdown 語法什么時候直接支持代碼高亮,加粗就好了