Posted :
    A
    TableLayout 
    is first of all a 
    LinearLayout with a vertical
    orientation 
    , so the properties 
    of LinearLayout ,
    such as weight , apply to a TableLayout .
    layout_weight is just how the remaining free 
    space is divided .
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TableRow
        android:layout_weight="1"
        android:background="@color/colorAccent"/>
    <Button
        android:layout_weight="1"
        android:background="@color/colorPrimaryDark" />
    <TextView
        android:layout_weight="1"
        android:background="@android:color/holo_orange_light" />
</TableLayout>
 
    A
    TableLayout
    can contain
     0 or more
    table rows  , where a row can either be
    a View or a
     TableRow .
    A View
    such as 
    an ImageView , or a
    Button will have a width
    of MATCH_PARENT , and
    a default height of WRAP_CONTENT .
    The VIEW height can be changed .
    A  TableRow is
      a class which
    extends  LinearLayout , and
    which has a horizontal orientation .
    A  TableRow width , is always set
    to match its parent , as in MATCH_PARENT ,
    and its height , is always set to wrap its content ,
    as in WRAP_CONTENT .
    A TableRow being
    a LinearLayout ,  the
    concept of weight
    ,
    equally applies .
    layout_weight
    being how the
    remaining free space is divided .
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TableRow android:layout_weight="1"
              android:background="@color/colorAccent">
        <Button
            android:layout_gravity="center_vertical"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:background="@android:color/black"
            android:text="Button 1"
            android:textColor="@android:color/white" />
        <Button
            android:layout_gravity="bottom"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:background="@android:color/black"
            android:text="Button 2"
            android:textColor="@android:color/white" />
        <Button
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:background="@android:color/black"
            android:text="Button 3"
            android:textColor="@android:color/white" />
    </TableRow>
    <TableRow android:layout_weight="1"
              android:background="@color/colorPrimaryDark" />
    <Button
        android:layout_weight="1"
        android:text="A Button"
        android:textColor="@android:color/white"
        android:background="@android:color/holo_orange_light" />
</TableLayout>
 
    An added feature
     of the Tablelayout
    is the concept of cells and columns .
A cell is just a row's child .
A column is formed of cells in the vertical direction . The number of columns , is the max number of cells for all rows . The width of a column , is the largest width of its given cells , and the width of the cells in a column , will match the width of the column , unless weighting is being used .
<!-- Example three -->
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TableRow android:background="@color/colorPrimary">
        <Button
            android:layout_width="250dp" />
        <Button
            android:layout_width="100dp" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_width="0dp" />
        <Button />
    </TableRow>
    <TableRow  android:background="@color/colorPrimary">
        <Button
            android:layout_width="1dp"
            android:layout_weight="1" />
        <Button
            android:layout_width="1dp"
            android:layout_weight="1" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_width="0dp"
            android:layout_weight="1" />
        <Button
            android:layout_width="0dp"
            android:layout_weight="1" />
    </TableRow>
    <TextView android:background="@android:color/holo_orange_light" />
</TableLayout>
 
    In 
    a TableLayout  , the
    android:collapseColumns
    attribute can be
    used to control if one or more columns
    are to be collapsible
    , hence hidden  . This is done
    by specifying the index of columns to be collapsed ,
    separated by commas , as in android:collapseColumns="0"
    or android:collapseColumns="0,3" .
    So given the previous
    example , if the column
    at index 0
    is set to be collapsible , as in :
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:collapseColumns="0">
    <TableRow android:background="@color/colorPrimary">
        <Button
            android:layout_width="250dp" />
        <Button
            android:layout_width="100dp" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_width="0dp" />
        <Button />
    </TableRow>
    <TableRow  android:background="@color/colorPrimary">
        <Button
            android:layout_width="1dp"
            android:layout_weight="1" />
        <Button
            android:layout_width="1dp"
            android:layout_weight="1" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_width="0dp"
            android:layout_weight="1" />
        <Button
            android:layout_width="0dp"
            android:layout_weight="1" />
    </TableRow>
    <TextView android:background="@android:color/holo_orange_light" />
</TableLayout>
Then the new outcome in comparison to the older outcome , is :
 
     
    A 
    column can also be
    set as being stretchable
    ,
    in its TableLayout , by using the
    TableLayout attribute
    android:stretchColumns . One
    or more indexes can be specified , as in ,
    android:stretchColumns="0" , or
    android:stretchColumns="1,3" . In
    such a case , the specified columns will be stretched to fill
    the available empty space .
    So if
    example three is to be reconsidered 
    ,
    the column at index 1  is set to be
    stretchable , as follows :
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:stretchColumns="1" >
    <TableRow android:background="@color/colorPrimary">
        <Button
            android:layout_width="250dp" />
        <Button
            android:layout_width="100dp" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_width="0dp" />
        <Button />
    </TableRow>
    <TableRow  android:background="@color/colorPrimary">
        <Button
            android:layout_width="1dp"
            android:layout_weight="1" />
        <Button
            android:layout_width="1dp"
            android:layout_weight="1" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_width="0dp"
            android:layout_weight="1" />
        <Button
            android:layout_width="0dp"
            android:layout_weight="1" />
    </TableRow>
    <TextView android:background="@android:color/holo_orange_light" />
</TableLayout>
Comparing example three result , with the current result , yields :
 
     
    A 
    column can also be
    set to be shrinkable
    ,
    in its TableLayout , by using
    the TableLayout attribute ,
    android:shrinkColumns , where
    1 or more columns , separated
    by a comma , can be specified , as in
    android:shrinkColumns="1,4" .
    In this case , the specified columns , will
    shrink , to accomodate the TableLayout
    width .
    So if
    example three is to be retaken
    , and
    if a width of 300dp is specified ,
    with  the android:shrinkColumns="1"
    attribute being set , as follows :
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:shrinkColumns="1">
    <TableRow android:background="@color/colorPrimary">
        <Button
            android:layout_width="250dp" />
        <Button
            android:layout_width="100dp" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_width="0dp" />
        <Button />
    </TableRow>
    <TableRow  android:background="@color/colorPrimary">
        <Button
            android:layout_width="1dp"
            android:layout_weight="1" />
        <Button
            android:layout_width="1dp"
            android:layout_weight="1" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_width="0dp"
            android:layout_weight="1" />
        <Button
            android:layout_width="0dp"
            android:layout_weight="1" />
    </TableRow>
    <TextView android:background="@android:color/holo_orange_light" />
</TableLayout>
    Then
    in comparison to not setting
     the
    shrinkColumns
    attribute , the result will be :
 
     
Since the number of columns in a row , is specified as being the max number of cells for all rows , what if what is needed , is to have some rows which have fewer cells , or in other words cells which span multiple columns ?
    The answer to this question , is to use
    the android:layout_span
    attribute , as in 
    android:layout_span="2" , 
    to specify the number of columns 
    a cell will span , which means 
    the number of columns a cell 
    will take .
    A
    cell always follows the natural flow of positioning , and it
    can be positioned in a specific 
    column , using the
    layout_column attribute , as
    in android:layout_column="1" . So 
    in this example , it will be positioned in 
    column 1 .
    An example
     about the earlier 2
    attributes is :
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TableRow android:background="@color/colorPrimary">
        <Button
            android:layout_width="250dp" />
        <Button
            android:layout_width="100dp" />
        <Button
            android:layout_width="50dp" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_width="0dp" />
        <Button />
    </TableRow>
    <TableRow  android:background="@color/colorPrimary">
        <Button
            android:layout_width="1dp"
            android:layout_weight="1" />
        <Button
            android:layout_width="1dp"
            android:layout_weight="1" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_width="0dp"
            android:layout_weight="1" />
        <Button
            android:layout_width="0dp"
            android:layout_weight="1" />
    </TableRow>
    <TableRow android:background="@color/colorPrimary">
        <Button
            android:layout_column="1" />
    </TableRow>
    <TableRow android:background="@color/colorAccent">
        <Button
            android:layout_column="1"
            android:layout_span="2"
            />
    </TableRow>
    <TextView android:background="@android:color/holo_orange_light" />
</TableLayout>
The outcome of the previous xml code is as follows :
