Android 網格佈局 GridLayout
阿新 • • 發佈:2020-06-25
- 大部分的開發者可能都不知道有這個佈局方式的存在;
- 有些開發者雖然知道,但是很多時候不會去使用這個佈局方式;
- 很少的開發者會花時間研究這個佈局方式,也不會靈活的使用;
- 之所以會花一個章節來講,是希望大家能夠引起重視。
1. GridLayout 的特性
顧名思義 GridLayout 可以幫助你完成各式各樣的網格形式的佈局,比如一個計算器、或者一個登陸框。如果你前面學紮實也許會質疑,這個可以用巢狀的 LinearLayout 來代替,這也是為什麼很多人不願意用 GridView 的原因。但是你是看過教程的人,已經是個成熟的新手了,這裡我們需要強調的是**“效能”**,我們在開發中不僅要實現功能,同時要注重APP的效能。GridView 相比於 LinearLayout 層級更淺,所以它擁有更好的效能表現。這也是為什麼我希望大家能夠重視 GridLayout 的原因,好了,接下來看看如何使用。
2. GridLayout 的屬性
GridLayout的目的是將多個 View / ViewGroup 按照網格的形式排列起來,所以大多數的屬性都是為了規範一個網格的樣式。
2.1 網格的總行數和總列數
- android:rowCount: 設定網格的總行數
- android:columnCount: 設定網格的總列數
這兩個屬性直接設定一個整形數即刻,如:
android:rowCount="3"
android:columnCount="4"
2.2 當前 View 所在的行數、列數
- android:layout_row: 設定當前View擺放在網格的第幾行
- android:layout_column:
同樣直接設定數字即可,注意這裡是從0開始:
android:layout_row="4"
android:layout_column="0"
2.3 當前 View 佔據的空間
- android:layout_rowSpan: 設定當前 View 佔據幾行的空間
- android:layout_columnSpan: 設定當前 View 佔據幾列的空間
android:layout_rowSpan="2"
android:layout_columnSpan="3"
3. 通過 XML 實現一個登入介面
在編寫程式碼之前,我們先來一起來分析分析這個頁面,一步一步的把它拆分成一個網格:
- 整個頁面佔滿全屏,我們知道直接把 GridView 的長寬設定成
match_parent
即可 - 從左到右一共分為 3 列:
- 賬號/密碼
- 下劃線輸入框
- 提交
- 第一行和第二行佔滿全列,“提交”在最後一行的最後一列
基本上按照以上思路就可以把整個頁面按照網格分割好,接下來就可以開始 xml 程式碼的編寫了:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnCount="3"
android:useDefaultMargins="true">
<TextView
android:layout_columnSpan="3"
android:layout_gravity="center_horizontal"
android:text="使用者登入"
android:textSize="32sp" />
<TextView
android:layout_columnSpan="3"
android:layout_gravity="left"
android:text="請輸入您的賬號密碼:"
android:textSize="20sp" />
<TextView
android:layout_gravity="right"
android:text="賬號:" />
<EditText android:ems="10" />
<TextView
android:layout_column="0"
android:layout_gravity="right"
android:text="密碼:" />
<EditText android:ems="8" />
<Button
android:layout_row="3"
android:layout_column="2"
android:layout_gravity="bottom"
android:text="提交" />
</GridLayout>
以上程式碼有幾點需要注意:
- 我們僅僅指定了列數,系統可以根據列數計算出行數;
- GridLayout 內部的 View 在沒有設定具體的行列序號的時候,預設按照順序依次從左往右、從上往下依次排列;
- GridLayout 非常智慧,為了向大家展示它的優勢,本程式碼中也省略了大量的屬性設定,全都交給系統自行計算。不過在實際使用中建議還是標註出來,這樣可讀性更高。
4. 小結
GridLayout 結合了 LinearLayout、RelativeLayout、FrameLayout、TableLayout 的當中的一些特性,它可以實現一些需要多層 View 巢狀才能實現的佈局效果。我們要想與其他開發者拉開差距,就必須在編寫UI的時候不只看效果是否達到,更需要考慮底層的效能損耗。這也是 GridView 的一大優勢。
在實際開發中,我們往往會結合各種各樣的佈局完成我們的 UI,但是很重要的一點是選擇你的頂層(root)佈局的時候一定要深思熟慮,因為它會直接影響到你的 UI 繪製效能和記憶體消耗。