TableLayout表格佈局學習

          在Web開發中,我們會接觸到形形色色的表格,HTML中的元素爲我們實現了表格的實現,可以說,表格是我們使用最多的元素。在Android中,我們可以使用TableLayout來實現表格佈局。HTML的表格中使用來表示表格的一行,類似的,在TableLayout中,我們也有對應的TableRow來表示表格的一行。但在Android中就不往下區分表格單元了,也就是沒有相應的

        下面首先來看一下TableLayout的文檔:
       
         它是LinearLayout線性佈局管理器的子類,其繼承結構爲:
java.lang.Object
   ↳ android.view.View
   ↳ android.view.ViewGroup
   ↳ android.widget.LinearLayout
   ↳ android.widget.TableLayout

       從文檔中不難看出,要使用TableLayout就離不開TableRow,那麼TableRow的文檔如下:
     
     其也是LinearLayout的子類,繼承結構如下:
java.lang.Object
   ↳ android.view.View
   ↳ android.view.ViewGroup
   ↳ android.widget.LinearLayout
   ↳ android.widget.TableRow

    在Eclipse中創建一個項目來說明TableLayout,首先使用XML來定義佈局管理器:
Xml代碼  收藏代碼
    <?xml version="1.0" encoding="utf-8"?>  
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:orientation="vertical" >  
        <TableRow>  
            <EditText  
                android:id="@+id/edit"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:text="請輸入內容" />  
            <Button  
                android:id="@+id/btn"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:text="搜索" />  
        </TableRow>  
        <View  
            android:id="@+id/hr"  
            android:layout_height="2dp"  
            android:background="#FDF5E6" />  
        <TableRow>  
            <TextView  
                android:id="@+id/label"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:text="請選擇您的性別" />  
            <RadioGroup  
                android:id="@+id/gender"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:checkedButton="@+id/male"  
                android:orientation="vertical" >  
                <RadioButton  
                    android:id="@+id/male"  
                    android:text="男" />  
                <RadioButton  
                    android:id="@+id/female"  
                    android:text="女" />  
            </RadioGroup>  
        </TableRow>  
    </TableLayout>  


    我們創建了一個表格佈局管理器,在其中創建了兩行,也就是兩個TableRow元素。在第一行中,我們放置了兩個組件,一個是文本輸入組件,給出默認提示文字。第二個是一個按鈕,構成一個搜索框。
    第二個TableRow中我們放置了一個提示文本和一個單選按鈕,那麼創建一個TextView和一個RadioGroup就行了。在RadioGroup中我們設置RadioButton是縱向排列的,然後默認選中一個。
    在兩個TableRow中間,我們放置了一個<View>元素,可以表示任意的組件,這裏我們放置一個水平線,就像HTML中的<hr>元素效果,設置寬度是2dp,顏色爲#FDF5E6。
    運行這段程序,我們就得到如下的顯示效果:

        我們在Web開發中使用表格最多的應用就是數據顯示了,那麼在Android中也會需要用表格來顯示數據,下面我們就來看看如何使用TableLayout和TableRow來顯示數據,再創建一個佈局管理器文件(在layout下創建datadisplay.xml),

    那麼在R.java中我們就會得到對應的資源:
Java代碼  收藏代碼
    package org.pioneer;  
    public final class R {  
        public static final class attr {  
        }  
        public static final class drawable {  
            public static final int ic_launcher=0x7f020000;  
        }  
        public static final class id {  
            public static final int btn=0x7f050001;  
            public static final int edit=0x7f050000;  
            public static final int female=0x7f050006;  
            public static final int gender=0x7f050004;  
            public static final int hr=0x7f050002;  
            public static final int label=0x7f050003;  
            public static final int male=0x7f050005;  
        }  
        public static final class layout {  
            public static final int datadisplay=0x7f030000;  
            public static final int main=0x7f030001;  
        }  
        public static final class string {  
            public static final int app_name=0x7f040001;  
            public static final int hello=0x7f040000;  
        }  
    }  


    下面來編寫這個佈局文件,其內容如下:
Xml代碼  收藏代碼
    <?xml version="1.0" encoding="utf-8"?>  
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent" >  
        <TableRow>  
            <TextView  
                android:layout_column="0"  
                android:gravity="center_horizontal"  
                android:padding="10dp"  
                android:text="序號" />  
            <TextView  
                android:layout_column="1"  
                android:gravity="center_horizontal"  
                android:padding="10dp"  
                android:text="姓名" />  
            <TextView  
                android:layout_column="2"  
                android:gravity="center_horizontal"  
                android:padding="10dp"  
                android:text="城市" />  
            <TextView  
                android:layout_column="3"  
                android:gravity="center_horizontal"  
                android:padding="10dp"  
                android:text="性別" />  
        </TableRow>  
    </TableLayout>  


       這裏我們僅僅定義出表格的表頭,有4列顯示內容,那麼layout_column表示的就是該列的編號,可以看出,這個編號是從0開始的,同時這是顯示樣式的水平居中顯示,並且都有10dp的間距。修改Activity程序中的佈局管理器文件:
Java代碼  收藏代碼
  1. super.setContentView(R.layout.datadisplay); 
    運行程序,此時得到如下顯示效果:

        那麼可以看到,表頭我們就做出來了,下面繼續設置內容:
Xml代碼  收藏代碼
    <View  
        android:layout_height="2dp"  
        android:background="#FDF5E6" />  
    <TableRow>  
        <TextView  
            android:layout_column="0"  
            android:gravity="center_horizontal"  
            android:padding="5dp"  
            android:text="001" />  
        <TextView  
            android:layout_column="1"  
            android:gravity="center_horizontal"  
            android:padding="10dp"  
            android:text="Sarin" />  
        <TextView  
            android:layout_column="2"  
            android:gravity="center_horizontal"  
            android:padding="10dp"  
            android:text="遼寧省大連市高新園區七賢嶺匯賢園七號騰飛軟件園二號樓" />  
        <TextView  
            android:layout_column="3"  
            android:gravity="center_horizontal"  
            android:padding="10dp"  
            android:text="男" />  
    </TableRow>  
    <TableRow>  
        <TextView  
            android:layout_column="0"  
            android:gravity="center_horizontal"  
            android:padding="5dp"  
            android:text="002" />  
        <TextView  
            android:layout_column="1"  
            android:gravity="center_horizontal"  
            android:padding="10dp"  
            android:text="Tom" />  
        <TextView  
            android:layout_column="2"  
            android:gravity="center_horizontal"  
            android:padding="10dp"  
            android:text="北京市" />  
        <TextView  
            android:layout_column="3"  
            android:gravity="center_horizontal"  
            android:padding="10dp"  
            android:text="男" />  
    </TableRow>  


    我們設置了一條水平橫線,下面是兩條數據的顯示,那麼運行程序,我們會看到這樣的顯示效果:

    顯示不下不要緊,我們切換到橫屏模式下再看:

    但是問題仍然存在,因爲某一個文本太長了,並且我們設置了水平居中顯示的效果,所以後面的內容都顯示不下消失了,顯然這麼顯示不合理,需要列可以折行顯示內容,設置如下內容:
Xml代碼  收藏代碼
  1. 下內容:  
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"   
    android:shrinkColumns="2">  


    在TableLayout元素上我們設置一個shrinkColumns屬性,就是設置哪一列可以折行顯示,這裏是第三列需要折行顯示,設置完成,顯示效果如下:

       我們就得到了預期的效果。表格佈局中還可以設置隱藏列,那麼需要在TableLayout上設置如下屬性:
Xml代碼  收藏代碼
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"   
        android:shrinkColumns="2"  
        android:collapseColumns="0,3">  


    這裏我們設置第一列和第四列爲不顯示狀態,那麼就得到如下顯示效果:

    和前面兩個佈局管理器類似,我們也可以通過程序來控制表格佈局管理器。不難想到這裏我們需要四個類來完成,分別是TableLayout,TableLayout.LayoutParams,TableRow,TableRow.LayoutParams
    下面來看一下TableLayout.LayoutParams的文檔:

    可以看出TableLayout.LayoutParams繼承自LinearLayout.LayoutParams,其繼承結構如下:
java.lang.Object
   ↳ android.view.ViewGroup.LayoutParams
   ↳ android.view.ViewGroup.MarginLayoutParams
   ↳ android.widget.LinearLayout.LayoutParams
   ↳ android.widget.TableLayout.LayoutParams

    下面是TableRow.LayoutParams,其實它們都是類似的:

    它的繼承結構爲:
java.lang.Object
   ↳ android.view.ViewGroup.LayoutParams
   ↳ android.view.ViewGroup.MarginLayoutParams
   ↳ android.widget.LinearLayout.LayoutParams
   ↳ android.widget.TableRow.LayoutParams

    下面我將在XML佈局管理文件中配置的數據表格用程序來進行編寫,那麼就需要準備數據,表格數據可以看作是二維表,那麼很自然想到,在數據量不大時可以使用而爲數組來表示,其代碼如下:
Java代碼  收藏代碼
    package org.pioneer;  
    import android.app.Activity;  
    import android.os.Bundle;  
    import android.view.ViewGroup;  
    import android.widget.TableLayout;  
    import android.widget.TableRow;  
    import android.widget.TextView;  
    public class TableLayoutDemoActivity extends Activity {  
        private String tableData[][] = new String[][] { { "序號", "姓名", "地址", "性別" },  
                { "001", "Sarin", "遼寧省大連市高新園區七賢嶺匯賢園七號騰飛軟件園二號樓", "男" },  
                { "002", "Tom", "北京市", "男" } };// 定義顯示的數據  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            TableLayout layout = new TableLayout(this);// 定義佈局管理器  
            TableLayout.LayoutParams layoutParams = new TableLayout.LayoutParams(  
                    ViewGroup.LayoutParams.FILL_PARENT,  
                    ViewGroup.LayoutParams.FILL_PARENT);// 定義佈局管理器參數  
            layout.setBackgroundResource(R.drawable.ic_launcher);// 設置背景圖片  
            for (int i = 0; i < tableData.length; i++) {  
                TableRow row = new TableRow(this);// 定義TableRow  
                for (int j = 0; j < tableData[i].length; j++) {  
                    TextView text = new TextView(this);// 定義TextView組件  
                    text.setText(tableData[i][j]);// 設置TextView的顯示文字  
                    row.addView(text, j);// 向TableRow中添加TextView組件  
                }  
                layout.addView(row);// 向佈局管理器中添加表格行  
            }  
            super.setContentView(layout, layoutParams);// 設置佈局管理器  
        }  
    }  


    對於二維數組的遍歷必然是嵌套的循環來進行,運行程序,我們得到如下效果:

    可以看到,我們之前設置的顯示效果都不存在了,當然這可以通過代碼繼續設置樣式,但該代碼已經相當的複雜了,如果繼續修改程序,那程序必然顯得十分臃腫。所以對複雜佈局我們採用XML文件的配置方式來進行是比較好的方法。

 

     方法總結:

TableLayout經常用到的屬性有:

android:collapseColumns:以第0行爲序,隱藏指定的列:

android:collapseColumns該屬性爲空時,效果如下圖:

0

把android:collapseColumns=0,2--------------》意思是把第0和第2列去掉,如下圖:

1

android:shrinkColumns:以第0行爲序,自動延伸指定的列填充可用部分:

當LayoutRow裏面的控件還沒有佈滿佈局時,shrinkColumns不起作用,如下圖:

2.1

設置了shrinkColumns=0,1,2,佈局完全沒有改變,因爲LayoutRow裏面還剩足夠的空間。

當LayoutRow佈滿控件時,如下圖:

2

設置設置了shrinkColumns=2,則結果如下圖,控件自動向垂直方向填充空間:

3

android:stretchColumns:以第0行爲序,儘量把指定的列填充空白部分:

4

設置stretchColumns=1,則結果如下圖,第1列被儘量填充(Button02與TextView02同時向右填充,直到TextView03被壓擠到最後邊)。

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章