Table : "표" -> 표처럼 사용할 수 있으며 열(Coulmn), 행(Row)로 표현된다.
위 그림처럼 표(Table)과 비슷한 구조일 때 LinearLayout이나 ConstraintLayout으로 디자인하는 것보다 TableLayout으로 디자인하는 것이 훨씬 효율적이다.
TableLayout은 자신의 하위 요소를 행과 열에 배치. Container는 행, 열, 테두리 선을 표시하지 않는다. 테이블은 셀을 비워둘 수 있다.
<TableRow>
라는 요소를 명시적으로 사용<TableRow>
에 뷰(View) 위젯을 선언하는 것만으로 새로운 열(Column)이 추가된다.
<TableLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="24sp"
android:background="#F44336"
android:textColor="#FFFFFF"
android:text="A" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="24sp"
android:background="#9C27B0"
android:textColor="#FFFFFF"
android:text="B" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="24sp"
android:background="#3F51B5"
android:textColor="#FFFFFF"
android:text="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="24sp"
android:background="#00BCD4"
android:textColor="#000000"
android:text="2" />
</TableRow>
</TableLayout>
위에서 설명한 것 처럼 열을 추가할 때는 그저 요소를 추가하기만 하고 다음 행으로 추가할 때는 <TableRow>
를 따로 명시해 주어 사용한다. 즉, 가로로 열부터 추가한다고 보면된다.
TableLayout 열(Column)의 갯수는 가장 많은 셀(Cell)을 가진 TableRow
의 셀 개수에 맞춰진다.
위와 같은 경우 세 개의 TableRow, 열은 4, 2, 1 왼쪽부터 채워져서 4개보다 작은 열 갯수이면 빈공간으로 남게 된다.
기본적으로 열(Column)의 너비는 다른 행(Row), 같은 열(Column)의 셀 중에서 가장 넓은 (Column)의 너비에 맞춰진다. 즉, TableLayout의 여러 TableRow에 추가된 같은 열(Column)의 자식 뷰 위젯 중에서 가장 큰 너비를 가진 뷰 위젯의 너비에 맞춰진다.
위 그림처럼 AAAAAAAAAAAAAAAA 셀이 가장 큰 너비를 가지고 있으므로 1열은 해당 셀의 너비로 맞춰진다. 그런데 2열은 1열의 너비보다 훨씬 작다. 하지만 TableLayout을 사용하고자 하는 대부분의 경우, 전체 너비를 균등분할한 크기로 열(Column)의 너비를 지정하거나, 열(Column)의 위치(index)에 따라 어떤 열(Column)은 내용의 크기대로 표시하고, 다른 열은 나머지 공간을 모두 차지하도록 늘려서 표시하고 싶을 것이다. 이 경우는
stretch(늘이다) Columns(열) : TableLayout의 열 중에서 너비를 늘여서 표시할 열을 지정하기 (이 때 TableLayout의 Width는 꽉 채워진다.)
<TableLayout ...
android:stretchColumns="1,3">
<TableRow>
<TextView ... android:text="A" />
<TextView ... android:text="B" />
<TextView ... android:text="C" />
<TextView ... android:text="D" />
</TableRow>
<TableRow>
<TextView ... android:text="1" />
<TextView ... android:text="2" />
<TextView ... android:text="3" />
<TextView ... android:text="4" />
</TableRow>
</TableLayout>
만약 전체 열의 너비가 늘어나게 만드려면 stretchCoulmns에 "*" 값을 지정하면 된다.
<TableLayout ... android:stretchColumns="1,3">
<TableLayout>
요소에 "background" 속성을 사용<TableRow>
요소에 "background" 속성을 사용TableLayout, TableRow의 배경색과 padding, layout_margin 속성을 이용하여 TableLayout에 테두리가 그려진 효과를 낼 수 있다.
<TableLayout
android:background="#000000"
android:padding="8dp"
android:stretchColumns="*">
<TableRow
android:background="#FFFFFF">
<TextView ... android:layout_margin="1dp"/>
<TextView ... android:layout_margin="1dp"/>
...
</TableRow>
<TableRow
android:background="#FFFFFF">
<TextView ... android:layout_margin="1dp"/>
<TextView ... android:layout_margin="1dp"/>
...
</TableRow>
...
</TableLayout>
전체 Table을 검정색으로 두고 각 행들을 모두 흰색으로 만들기, 그리고 마진을 주면 표의 모양이 된다.
아무런 옵션 없이 TableLayout
의 행(Row)에 셀(Cell)을 추가하면 자동적으로 열(Coulmn) 번호가 0에서부터 1씩 증가.
그런데 TableRow의 LayoutParam에는 순차적으로 셀(Cell)을 추가하지 않고 열 수서를 직접 지정하여 셀 추가하는 속성이 있다. => Layout_column
android:layout_column - 뷰(View)가 추가될 열(Column) 인덱스 지정
- 정수 type
<TableRow>
<TextView.../>
<TextView.../>
<TextView.../>
<TextView.../>
</TableRow>
<TableRow>
<TextView
...
android:layout_column="2"
/>
</TableRow>
<TableRow>
<TextView
...
android:layout_column="1"
/>
<TextView
...
android:layout_column="3"
/>
</TableRow>
</TableLayout>
android:layout_span - 합치고자 하는 셀(Cell)의 개수 지정.
- 정수 값 사용. (예. 3)
- 열(Column) 방향으로만 셀(Cell) 합치기 가능.
- 값이 지정된 셀(Cell)의 오른쪽 방향으로 셀(Cell)이 합쳐짐.
- 1이상의 값 사용 가능.
<TableRow>
<TextView.../>
<TextView.../>
<TextView.../>
<TextView.../>
</TableRow>
<TableRow>
<TextView
...
android:layout_column="2"
/>
</TableRow>
<TableRow>
<TextView
...
android:layout_span = "2"
/>
<TextView
...
android:layout_span = "2"
/>
</TableRow>
</TableLayout>
android:collapseColumns - 감추고자 하는 열(Column)의 인덱스 지정.
- 열(Column)의 인덱스는 0부터 시작. (zero-based)
- 하나 이상의 열(Column)을 ','(comma)로 분리하여 지정. (예. "0,2,4")
- 모든 열(Column)을 지정하려면, '*'기호 사용.
<TableLayout
...
android:stretchColumns="*"
android:collapseColumns="0,2"
>
<TableRow>
...
</TableRow>
<TableRow>
...
</TableRow>
<TableRow>
...
</TableRow>
</TableLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
0과 2 를 숨겨서 1.1이 포함된 열과 3.1이 포함된 열이 숨겨진 모습
android:shrinkColumns - 줄이고자 하는 열(Column)의 인덱스 지정.
- 열(Column)의 인덱스는 0부터 시작. (zero-based)
- 하나 이상의 열(Column)을 ','(comma)로 분리하여 지정. (예. "0,2,4")
- 모든 열(Column)을 지정하려면, '*'기호 사용.
<TableLayout
...
android:stretchColumns="*"
android:shrinkColumns="0,2"
>
<TableRow>
<TextView
...
android:text="1.111111111"
/>
<TextView
android:text="2.111111111"
/>
<TextView
android:text="3.111111111"
/>
<TextView
android:text="4.1"
/>
</TableRow>
<TableRow>
...
</TableRow>
<TableRow>
...
</TableRow>
</TableLayout>
인덱스 0과 2를 Shrink해서 1.111111111111 이 있는 열과 3.11111111111 이 있는 열의 너비가 줄어든 모습
TableLayout과 TableRow는 LinearLayout을 상속받았다. 즉, LinearLayout에 구현된 기능을 사용할 수 있다.
이 때 layout_weight를 적용하는 속성의 layout_width는 0dp이어야 한다.
<TableLayout ...>
<TableRow>
<TextView ...
android:layout_width="0dp"
android:layout_weight="1"
android:text="A" />
<TextView ...
android:layout_width="0dp"
android:layout_weight="2"
android:text="B" />
<TextView ...
android:layout_width="0dp"
android:layout_weight="3"
android:text="C" />
</TableRow>
</TableLayout>
이 때는 TableRow 에 속성으로 layout_weight를 지정해주는데 속성으로 layout_height 가 0dp 이어야 한다!
<TableLayout ...
android:stretchColumns="*">
<TableRow
android:layout_height="0dp"
android:layout_weight="1">
<TextView ... android:text="A" />
<TextView ... android:text="B" />
<TextView ... android:text="C" />
</TableRow>
<TableRow
android:layout_height="0dp"
android:layout_weight="1">
<TextView ... android:text="1" />
<TextView ... android:text="2" />
<TextView ... android:text="3" />
</TableRow>
</TableLayout>
TableRow 가 대신 다른 뷰를 추가할 수 있다.
<TableLayout
...
>
<TableRow>
...
</TableRow>
<ImageView
android:layout_height="50dp"
android:src="@drawable/img_album_exp2"
android:scaleType="centerInside"
></ImageView>
<TableRow>
...
</TableRow>
</TableLayout>
출처 :
https://recipes4dev.tistory.com/138
https://developer.android.com/guide/topics/ui/layout/grid
https://codenet.tistory.com/16
https://zion830.tistory.com/14