1. 程式人生 > Android入門教學 >Android 網格佈局 GridLayout

Android 網格佈局 GridLayout

  • 大部分的開發者可能都不知道有這個佈局方式的存在;
  • 有些開發者雖然知道,但是很多時候不會去使用這個佈局方式;
  • 很少的開發者會花時間研究這個佈局方式,也不會靈活的使用;
  • 之所以會花一個章節來講,是希望大家能夠引起重視。

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:
    設定當前View擺放在網格的第幾列
    同樣直接設定數字即可,注意這裡是從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 實現一個登入介面

GridLayout示例

在編寫程式碼之前,我們先來一起來分析分析這個頁面,一步一步的把它拆分成一個網格:

  • 整個頁面佔滿全屏,我們知道直接把 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 繪製效能和記憶體消耗。