안녕하세요. 제임스입니다. 

 

최근에 지속적으로 안드로이드 레이아웃에 대한 소개를 하고 있는데요. 

이번에는 GridLayout 에 대한 내용 정리 하겠습니다. 

 

■ GridLayout 이란?

 

안드로이드의 GridLayout 은 2차원 격자 무늬 형태의 레이아웃으로 수직, 수평의 라인으로 구성되어 행과 열의 집합 형태로 만들어 지는 레이아웃입니다. 

그리드 라인은 인덱스 (index) 로 참조 되며 좌상단에서 부터 0, 0 좌료값으로 시작하게 됩니다. 

 

안드로이드 API Level 14 에 추가된 레이아웃으로 LinearLayout 과 RelativeLayout 의 단점을 보완하기 위해 만들어 메모리 효율이 좋다고 알려 지긴 했는데요, 사실 격자형태의 레이아웃을 구성해야 하는 경우가 아니라면 쓸일이 없고, 단말기 성능이 좋아 지면서 레이아웃에 따른 메모리 효율성을 따지기는 어렵게 되었습니다. 

하지만 여전히 격자 형태의 레이아웃을 구성하는 앱을 개발해야 한다면 정말 매력적인 레이아웃임은 두말할 필요가 없습니다. 

 

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.GridLayout

 

■ GridLayout 속성

GridLayout 속성에 대해 알아 보겠습니다. 

 

◎ 부모뷰에서 주로 사용하는 속성

columnCount : 부모뷰가 가지고 있는 행의 수

rowCount : 부모뷰가 가지고 있는 열의 수

 

◎ 자식뷰에서 주로 사용하는 속성

layout_column : 자식뷰의 행 좌표 (layout_row 속성과 세트로 사용)

layout_row : 자식뷰의 열 좌표 (layout_column 속성과 세트로 사용)

layout_columnSpan : 행으로 차지하는 자리수 

layout_rowSpan : 열로 차지하는 자리수

layout_gravity : 자식뷰의 위치를 설정 하는 속성으로 셀의 중앙 / 좌 / 우 / 상단 / 하단 등의 속성 값을 지정

 

 

■ GridLayout 사용예

 

간단한 예제와 함께 사용 방법에 대해 알아 보겠습니다. 

 

 

첫번째 라인을 보면 숫자가 3 > 1 > 2 순으로 나열 되어 있습니다. 

코드는 아래와 같이 작성 했습니다. 

 

<Button
    android:text="1" />

<Button
    android:text="2" />

<Button
    android:layout_column="0"
    android:layout_row="0"
    android:text="3" />

세번째 버튼에 layout_column layout_row 속성을 각각 0 으로 정의 했습니다. 

이는 임의로 개발자가 원하는 자식뷰를 특정 위치에 셋팅 하는 방식입니다. 

즉, 좌표값 0, 0 위치에 세번째 버튼을 배치함으로 인하여 자연스럽게 버튼 1, 2 번이 뒤로 밀려 나오게 됩니다. 

 

 

두번째 라인은 4, 5번 버튼 두개 밖에 없으며 5번 버튼이 두자리를 차지하고 있습니다. 

<Button
    android:layout_column="0"
    android:layout_row="2"
    android:text="4" />

<Button
    android:layout_column="1"
    android:layout_row="2"
    android:layout_columnSpan="2"
    android:layout_gravity="fill_horizontal"
    android:text="5" />

4번 버튼에도 layout_columnlayout_row 값을 0, 2 로 지정하여 첫번째 행의 두번째 열에 위치하게 했습니다. 

5번 버튼에도 layout_columnlayout_row 값을 1, 2 로 지정하여 두번째 행의 두번째 열에 위치하게 했습니다. 

그리고 5번 버튼에 columnSpan 속성을 2로 지정하여 열을 두자리 만큼 차지 하라고 지정했습니다. 

HTML 을 사용해보신 분들을 익숙한 단어가 보이실겁니다. 다만 HTML 과 다른건 layout_gravityfill 또는 fill_horizontal 로 지정을 해주지 않으며 원하는 만큼 자리를 차지 하지 않습니다. 

 

여기서 뭔가 이상한점이 보이지 않으신가요? 

layout_row 값이 2로 설정 되었는데 화면상에서는 2행에 있습니다. 

즉, layout_row 가 1인 자식뷰는 없는 레이아웃 구조 입니다. 

 

만약 위 코드에서 4번 버튼의 layout_row 값을 1로 설정하면 어떻게 될까요? 

<Button
    android:layout_column="0"
    android:layout_row="1"
    android:text="4" />

<Button
    android:layout_column="1"
    android:layout_row="2"
    android:layout_columnSpan="2"
    android:layout_gravity="fill_horizontal"
    android:text="5" />

 

 

위와 같이 2행에는 4번 버튼만 존재하고 3행에 5번 버튼만 존재하게 됩니다. 

 

 

세번째 및 네번째 라인 은 6번 버튼이 첫번재 열을 두자리나 차지하고 있습니다. 

<Button
    android:layout_gravity="fill_vertical"
    android:layout_rowSpan="2"
    android:text="6"
    />
<Button
    android:text="7" />
<Button
    android:text="8" />
<Button
    android:text="9" />
<Button
    android:text="10" />

6번 버튼에 layout_rowSpan 을 2로 줬습니다. 열을 두자리 차지하라는 의미 인데요. 

위 5번 버튼과 동일하게 layout_gravity 속성을 지정해줘야 합니다. 여기서는 수직방향으로 두자리를 차지 하므로 fill 또는 fill_vertical 값을 꼭 지정해주셔야 합니다. 

 

 

다섯번째 및 여섯번째 라인은 12번 버튼이 2 x 2 만큼 자리를 차지하고 있습니다. 

<Button
android:text="11" />

<Button
android:layout_gravity="fill_horizontal|fill_vertical"
android:layout_columnSpan="2"
android:layout_rowSpan="2"
android:text="12" />

<Button
android:text="13" />

12번 버튼의 layout_columnSpanlayout_rowSpan 값을 각각 2 씩 줬습니다. 

행과 열을 2자리씩 차지하라는 의미 이며 수직 및 수평 방향으로 2자리씩 차지해야 하므로 fill_horizontalfill_vertical 를 같이 사용해야 합니다. 그래서 파이프라인 "|" 을 이용하여 위와 같이 사용 하실 수 있으며 그냥 fill 하나만 사용해도 동일한 효과를 적용할 수 있습니다. 

 

 

xml 파일 전체 코드는 아래와 같습니다. 

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:columnCount="3"
    android:rowCount="6"
    android:orientation="horizontal"
    android:background="#b6e686"
    android:layout_margin="10dp"
    >

    <Space />

    <!-- 1열 -->
    <Button
        android:text="1" />

    <Button
        android:text="2" />

    <Button
        android:layout_column="0"
        android:layout_row="0"
        android:text="3" />

    <!-- 2열 -->
    <Button
        android:layout_column="0"
        android:layout_row="2"
        android:text="4" />

    <Button
        android:layout_column="1"
        android:layout_row="2"
        android:layout_columnSpan="2"
        android:layout_gravity="fill_horizontal"
        android:text="5" />

    <!-- 3열 & 4열 -->
    <Button
        android:layout_gravity="fill"
        android:layout_rowSpan="2"
        android:text="6"
        />
    <Button
        android:text="7" />
    <Button
        android:text="8" />
    <Button
        android:text="9" />
    <Button
        android:text="10" />

    <!-- 5열 & 6열 -->
    <Button
        android:text="11" />

    <Button
        android:layout_gravity="fill_horizontal|fill_vertical"
        android:layout_columnSpan="2"
        android:layout_rowSpan="2"
        android:text="12" />

    <Button
        android:text="13" />

</GridLayout>

 

GridLayout 속성 값 중에 columnCount 및 rowCount 속성이 있습니다. 

각각 3 과 6으로 지정하여 3x6의 격자형 레이아웃을 생성 했습니다. 

 

 

위에 언급한 속성들 이외에도 

layout_margin, layout_padding, layout_columnWeight, layout_rowWeight, layout_background 등등 일반적인 자식뷰에서 사용할 수 있는 속성들은 거의 모두 사용할 수 있습니다. 

참고 하시면 좋을 것 같습니다. 

 

 

 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안녕하세요. 제임스입니다. 


이번에는 TableLayotu 에 관한 내용을 포스팅해 보겠습니다. 

어떻게보면 바로 앞번에 포스팅한 GridLayout 과 정말 유사한 형태 입니다. 

(GridLayout 포스팅을 보시면 여기를 클릭해 주세요)


■ TableLayout 이란?

TableLayout 은 행(row)과 열(column)으로 구성되는 테이블 형태로 화면을 구성하는 레이아웃을 말합니다. 

TableLayout 의 각 행은 TableRow 인스턴스가 사용하며 이 TableRow 인스턴스는 하나의 자식뷰를 가지는 셀(cell)로 구성됩니다. 


java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.LinearLayout

↳ android.widget.TableLayout


■ TableLayout 속성

TableLayout 의 속성에 대해 알아 보겠습니다. 


◎ 부모뷰에서 사용하는 속성

collapseColumns : 지정 컬럼을 제거

shrinkColumns : 지정 컬럼 자동 축소

stretchColumns : 지정 컬럼 자동 확장


위 세가지 정도가 API 상에 존재하는 TableLayout 입니다. 


◎ 자식뷰에서 사용하는 속성

layout_column : 자식뷰가 위치할 컬럼의 index 값 지정 (0: 첫번째, 1: 두번째, 2: 세번째....)

layout_span : 자식뷰가 차지할 셀의 수를 지정 (예: 2로 지정시 두칸을 차지)


그외 기본적으로 View 가 가지는 속성들은 거의 대부분 사용 할 수 있습니다. 



■ TableLayout 예제


이제 예제를 통해 TableLayout 을 만나 보겠습니다. 




위 이미지와 같이 3x5 사이즈의 테이블을 생성 했습니다. 

작업은 아래와 같은 방법으로 진행 합니다. 



 자식뷰 개발 예


첫번째 라인은 TextView 1 과 TextView 2 가 나란히 배치 되어 있습니다. 

<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#75ccdf"
>
<TextView
android:text="TextView 1"
android:background="#82eb92"
android:padding="5dp"
/>
<TextView
android:text="TextView 2"
android:background="#95ad5d"
android:padding="5dp"
/>
</TableRow>

하나의 row 구성은 TableRow 로 선언하고 그 안에 자식뷰를 추가 하는 만큼 셀을 생성하게 되는데요. 여기서는 TableRow 안에 두개의 TextView 가 존재하여 한 row 에 두개의 셀(cell) 이 존재 합니다. 



두번째 라인은 TextView3 이 두 컬럼을 차지하도록 했습니다. 

<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#9e6dcf"
>
<TextView
android:text="TextView 3"
android:layout_span="2"
android:background="#78dab1"
android:padding="5dp"/>
</TableRow>

TextViewlayout_span2로 설정하여 두자리를 차지 하도록 배치했습니다. 



세번째 라인은 TextView4 를 세번째 컬럼에 위치 시켰습니다. 

<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#cf756d"
>
<TextView
android:layout_column="2"
android:text="TextView 4"
android:background="#e6da7f"
android:padding="5dp"/>
</TableRow>

TextView 에 layout_column 값을 2로 지정하여 세번째 컬럼에 위치하도록 배치합니다. 

(위치지정은 0 이 첫번째, 1 이 두번째, 2가 세번째... 입니다)



네번째 라인은 TextView5, 6, 7 세개의 자식뷰를 모두 추가 했습니다. 

<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#ebeb73"
>
<TextView
android:text="TextView 5"
android:background="#cf6da6"
android:padding="5dp"/>
<TextView
android:text="TextView 6"
android:background="#9e6dcf"
android:padding="5dp"/>
<TextView
android:text="TextView 7"
android:background="#6dcf8c"
android:padding="5dp"/>
</TableRow>

첫번째 라인과 별 차이 없이 TableRow 에 자식뷰로 TextView 를 하나 더 추가 했습니다.



다섯번째 라인은 TextView8 을 정중아에 위치 시켜보겠습니다. 

<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#6d75cf"
>
<TextView
android:layout_column="1"
android:text="TextView 8"
android:background="#cfa56d"
android:padding="5dp"/>
</TableRow>

TextView 에 layout_column 을 1로 지정하여 두번째 컬럼에 위치하도록 했습니다. 



 부모뷰 개발 예


부모뷰에서 사용하는 세가지 속성 값 기억 하시나요? 


collapseColumns : 지정 컬럼을 제거

shrinkColumns : 지정 컬럼 자동 축소

stretchColumns : 지정 컬럼 자동 확장


위 속성 값들은 " , "(콤마) 를 이용하여 컬럼 값을 추가 할 수 있습니다. 


하나 하나 살펴 보겠습니다. 


collapseColumns 에 제거하기 원하는 컬럼 값으로 1 을 설정해봤습니다. 

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#b6e686"
android:layout_margin="10dp"
android:collapseColumns="1"
>

컬럼 index 가 1인 두번째 컬럼에 있던 자식뷰들이 모두 제거 되었습니다. 

여기서 참고 할 점은 TextView3 의 경우 0번과 1번 모두 차지하고 있던 자식뷰 였으나 1번 인덱스에 포함되어 삭제 되었습니다. 



collapseColumns 값을 " , " 를 이용하여 1 과 2 두개값을 지정하여 두번째, 세번째 컬럼을 제거 했습니다. 

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#b6e686"
android:layout_margin="10dp"
android:collapseColumns="1, 2"
>




stretchColumns에 자동 확장하고자 하는 컬럼 index 값으로 1을 지정해봤습니다.  

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#b6e686"
android:layout_margin="10dp"
android:stretchColumns="1"
>

index 가 1인 두번재 컬럼이 확장 된 것을 확인 하실 수 있습니다. 



stretchColumns 값을 " , " 를 이용하여 1, 2 를 모두 확장하도록 설정 했습니다. 

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#b6e686"
android:layout_margin="10dp"
android:stretchColumns="1, 2"
>



stretchColumns 값을 " , " 를 이용하여 0, 1, 2 를 모두 확장하도록 설정 했습니다. 

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#b6e686"
android:layout_margin="10dp"
android:stretchColumns="0, 1, 2"
>

단 위와 같이 모든 컬럼을 지정 할 경우 " , " 를 사용하여 각각 입력 하지 않고 아래 코드와 같이 " * " 를 이용하면 편합니다. 

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#b6e686"
android:layout_margin="10dp"
android:stretchColumns="*"
>



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안녕하세요. 제임스 입니다. 


이번에는 안드로이드에서 LinearLayout 과 함께 가장 많이 사용되고 있는 RelativeLayout 에 대해 정리해 보겠습니다. 


■ Relativelayout 란?


뷰들을 상대적인 위치 정보를 설정하여 배치 시키는 형태 입니다. 

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

android.widget.RelativeLayout


■ RelativeLayout 속성

RelativeLayout 에는 많은 속성 값들이 존재 합니다. 


◎ 부모 컨테이너를 기준으로 설정하는 속성 목록


layout_alignParentBottom : 부모 컨테이너의 아래쪽과 뷰의 아래쪽을 맞춤

layout_alignParentEnd : 부모 컨테이너의 끝과 뷰의 끝을 맞춤 (오른쪽 끝)

layout_alignParentLeft : 부모 컨테이너의 왼쪽 끝과 뷰의 왼쪽 끝을 맞춤

layout_alignParentRight : 부모 컨테이너의 오른쪽 끝과 뷰의 오른쪽 끝을 맞춤

layout_alignParentStart : 부모 컨테이너의 시작점을 뷰의 시작점에 맞춤 (왼쪽 끝)

layout_alignParentTop : 부모 컨테이너의 상단 끝과 뷰의 상단 끝을 맞춤

layout_centerHorizontal : 부모 컨테이너의 수평방향 중간에 맞춤

layout_centerVertical : 부모 컨테이너의 수직방향 중간에 맞춤

layout_centerInParent : 부모 컨테이너의 수직 & 수평 중간에 맞춤 (정중앙에 위치)



◎ id 값으로 지정한 뷰 기준으로 설정하는 속성 목록


layout_above : 지정한 뷰의 위쪽에 위치 시킴

layout_alignBaseline : 지정한 뷰와 내용물의 아래쪽 기준선에 맞춤

layout_alignBottom : 지정한 뷰의 아래쪽과 맞춤

layout_alignEnd : 지정한 뷰의 끝에 맞춤

layout_alignLeft : 지정한 뷰의 왼쪽에 맞춤

layout_alignRight : 지정한 뷰의 오른쪽에 맞춤

layout_alignStart : 지정한 뷰의 시작점에 맞춤

layout_alignTop : 지정한 뷰의 상단에 맞춤

layout_below : 지정한 뷰의 아래쪽에 위치 시킴

layout_toLeftOf : 지정한 뷰의 왼쪽에 위치 시킴

layout_toRightOf : 지정한 뷰의 오른쪽에 위치 시킴


위 목록들이 자주 사용하는 속성값들입니다. 

위 값들만 적절히 잘 사용해 주시면 거의 모든 레이아웃 구성도 가능합니다. 



■ 부모 컨테이너를 기준으로 설정하는 속성 예제 


가장 위에 있는 민트색 바탕의 사각형에 속성01 부터 속성07 까지 사각형이 배치되어 있습니다. 



속성01 

- 어떠한 속성 값도 지정하지 않은 기본 상태로 RelativeLayout 내에서 좌측상단에 위치하게 됩니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#933c3c"
android:text="속성01"/>


속성02 

- layout_alignParentRight 속성을 true 로 지정하여 부모 컨테이너의 오른쪽 끝에 위치하게 했습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#ce5d24"
android:text="속성02"
android:layout_alignParentRight="true"
/>


속성03

- layout_alignParentBottom 속성을 true 로 지정하여 부모 컨테이너의 가장 아래쪽에 위치하게 했습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#980cd9"
android:text="속성03"
android:layout_alignParentBottom="true"
/>


속성04

- layout_alignParentRight 속성 및 layout_alignParentBottom 속성을 true 로 지정하여 부모 컨테이너의 우측하단에 위치하게 했습니다.

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#f9f902"
android:text="속성04"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
/>


속성05

- layout_centerHorizontal 속성을 true 로 지정하여 부모 컨테이너의 수평방향으로 중앙에 위치하게 했습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#d52d9a"
android:text="속성05"
android:layout_centerHorizontal="true"
/>


속성06

- layout_centerVertical 속성을 true 로 지정하여 부모 컨테이너의 수직방향으로 중앙에 위치하게 했습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#abf902"
android:text="속성06"
android:layout_centerVertical="true"
/>


속성07

- layout_centerInParent 속성을 true 로 지정하여 부모 컨테이너의 수직방향 및 수평방향 모두 중앙에 위치하게 했습니다. (정중앙 위치)

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#e7110a"
android:text="속성07"
android:layout_centerInParent="true"
/>



■ id 값으로 지정한 뷰를 기준으로 설정하는 속성 예제 




아래쪽 하늘색 큰 사각형은 상단의 민트색 사각형을 기준으로 layout_below 지정하여 마진 5dp 를 준 상태입니다. 

이번 화면에서는 속성07 의 붉은색 사각형을 기준으로 속성값을 지정 했습니다. 


속성07

- layout_centerInParent 값을 true 로 지정하여 부모 컨테이너의 정중앙에 배치 시켰습니다. 

- id 값을 tv_07 로 지정하여 다른 뷰들이 속성07을 기준으로 자리 배치를 하도록 합니다. 

<TextView
android:id="@+id/tv_07"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#e7110a"
android:text="속성07"
android:layout_centerInParent="true"
/>


속성08-1

- layout_toLeftOf 속성을 속성07의 id 값 기준으로 지정하여 속성07의 바로 왼쪽에 위치하고 있습니다. 

- 수직방향으로의 속성값을 지정하지 않았으므로 default 값으로 상단에 붙어 있습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:padding="10dp"
android:background="#0ae733"
android:text="속성08-1"
android:layout_toLeftOf="@id/tv_07"
/>


속성08-2

- layout_toLeftOf 속성을 속성07 기준으로 지정하여 속성07의 바로 왼쪽에 위치하고 있습니다. 

- layout_alignTop 속성을 속성07 기준으로 지정하여 속성07의 상단과 속성08-2의 상단을 같은 위치에 배치 했습니다. 

- 속성08-2 의 높이가 길어 속성07 보다 아래쪽으로 밀려 난것을 확인하실 수 있습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:padding="10dp"
android:background="#0ae733"
android:text="속성08-2"
android:layout_toLeftOf="@id/tv_07"
android:layout_alignTop="@id/tv_07"
/>


속성09-1

- layout_toRightOf 속성을 주고 속성07의 바로 오른쪽에 위치하고 있습니다. 

- 수직방향으로의 속성값을 지정하지 않았으므로 default 값으로 상단에 붙어 있습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:padding="10dp"
android:background="#b0e70a"
android:text="속성09-1"
android:layout_toRightOf="@id/tv_07"
/>


속성09-2

- layout_toRightOf 속성을 주고 속성07의 바로 오른쪽에 위치하고 있습니다. 

- layout_alignBottom 속성값을 지정하여 속성07의 한단과 속성09-2의 하단을 같은 위치에 배치 했습니다. 

- 속성09-2 의 높이가 길어 속성07보다 위로 치솟아 오른것을 확인 하실 수 있습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:padding="10dp"
android:background="#b0e70a"
android:text="속성09-2"
android:layout_toRightOf="@id/tv_07"
android:layout_alignBottom="@id/tv_07"
/>


속성10-1

- layout_above 속성을 주고 속성07의 바로 위에 위치하고 있습니다. 

- 수평방향으로의 속성값을 지정하지 않았으므로 default 값으로 좌측에 붙어 있습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#955ed9"
android:text="속성10-1"
android:layout_above="@id/tv_07"
/>


속성10-2

- layout_above 속성을 주고 속성07의 바로 위에 위치하고 있습니다. 

- layout_alignRight 속성값을 지정하여 속성07의 오른쪽 끝과 속성10-2의 오른쪽 끝을 일치 시켰습니다. 

- 속성10-2 의 길이가 길어 속성07의 좌측으로 벗어나 있는 것을 확인 하실 수 있습니다.  

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#955ed9"
android:text="속성10-2"
android:layout_above="@id/tv_07"
android:layout_alignRight="@id/tv_07"
/>


속성11-1

- layout_below 속성을 주고 속성07의 바로 아래에 위치하고 있습니다. 

- 수평방향으로의 속성값을 지정하지 않았으므로 default 값으로 좌측에 붙어 있습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#d58a65"
android:text="속성11-1"
android:layout_below="@id/tv_07"
/>


속성11-2

- layout_below 속성을 주고 속성07의 바로 아래에 위치하고 있습니다. 

- layout_alignLeft 속성을 지정하여 속성07의 좌측끝에 속성11-2의 좌측 끝을 일치 시켰습니다.

- 속성11-2 의 길이가 길어 속성07의 우측으로 벗어나 있는 것을 확인 하실 수 있습니다. 

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#d58a65"
android:text="속성11-2"
android:layout_below="@id/tv_07"
android:layout_alignLeft="@id/tv_07"
/>





아래는 이번 예제를 위해 작성한 전체 레이아웃 입니다. 



아래는 위 레이아웃을 구성하기 위해 작성한 xml 코드 전문입니다. 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tutorial.james.tutorial_linearlayout.MainActivity"
>

<RelativeLayout
android:id="@+id/rl_top"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="#11cc99"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#933c3c"
android:text="속성01"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#ce5d24"
android:text="속성02"
android:layout_alignParentRight="true"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#980cd9"
android:text="속성03"
android:layout_alignParentBottom="true"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#f9f902"
android:text="속성04"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#d52d9a"
android:text="속성05"
android:layout_centerHorizontal="true"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#abf902"
android:text="속성06"
android:layout_centerVertical="true"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#e7110a"
android:text="속성07"
android:layout_centerInParent="true"
/>

</RelativeLayout>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#7ee3ef"
android:layout_below="@id/rl_top"
android:layout_margin="5dp"
>

<TextView
android:id="@+id/tv_07"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#e7110a"
android:text="속성07"
android:layout_centerInParent="true"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:padding="10dp"
android:background="#0ae733"
android:text="속성08-1"
android:layout_toLeftOf="@id/tv_07"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:padding="10dp"
android:background="#0ae733"
android:text="속성08-2"
android:layout_toLeftOf="@id/tv_07"
android:layout_alignTop="@id/tv_07"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:padding="10dp"
android:background="#b0e70a"
android:text="속성09-1"
android:layout_toRightOf="@id/tv_07"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:padding="10dp"
android:background="#b0e70a"
android:text="속성09-2"
android:layout_toRightOf="@id/tv_07"
android:layout_alignBottom="@id/tv_07"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#955ed9"
android:text="속성10-1"
android:layout_above="@id/tv_07"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#955ed9"
android:text="속성10-2"
android:layout_above="@id/tv_07"
android:layout_alignRight="@id/tv_07"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#d58a65"
android:text="속성11-1"
android:layout_below="@id/tv_07"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#d58a65"
android:text="속성11-2"
android:layout_below="@id/tv_07"
android:layout_alignLeft="@id/tv_07"
/>

</RelativeLayout>

</RelativeLayout>

참고로 android:text 값을 하드코딩으로 입력 한것이 보이실 겁니다. 

이는 레이아웃 구조 설명을 위해 입력한 방식입니다. 

string.xml 에 문장을 지정하고 해당 id 값을 호출하여 사용하는 방식을 사용하는 것을 권해 드립니다. 

참고하세요 :)



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D




블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안녕하세요. 제임스 입니다. 


이번에는 안드로이드 레이아웃 종류 중 가장 기본중의 기본 Linear Layout 을 예제와 함께 정리해 보겠습니다. 



위와 같은 UI를 구성할 경우 아래와 같이 작성하게 됩니다. 



Example 1

<LinearLayout
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp"
android:background="@android:color/holo_blue_bright">

</LinearLayout>

layout_width 및 layout_height 는 match_parent (부모뷰의 크기에 맞춤) 또는 wrap_content (자식 뷰의 크기에 맞춤) 두가지 옵션과 함께 직접 고정값을 주는 방식이 있습니다. 


width (길이) 를 match_parent (부모 View 의 크기에 맞춤) 로 설정했지만 marginLeft 및 marginRight 옵션을 추가 하여 양엽으로 20dp 씩 공백을 줬습니다. height (높이)는 30dp 로 고정값을 적용했습니다. 


그리고 배경색은 background 에 안드로이드에서 제공하는 색중 holo_blue_bright 라는 값을 참조하였습니다. 



Example 2

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp"
android:padding="10dp"
android:background="@android:color/holo_orange_light"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="30dp"
android:background="@android:color/holo_purple">

</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="30dp"
android:background="@android:color/holo_green_light">

</LinearLayout>
</LinearLayout>

padding 10dp 를 줘서 예제 1번과 동일한 길이의 레이아웃 내부로 10dp 만큼 들어 간 형태로 자리 잡았습니다. 


orientation 이라는 값은 레이아웃이 수직구조를 가질 것인지 수평구조를 가질 것인지를 결정하는 속성입니다. 

만약 vertical(수직)로 설정 시 자식뷰들은 수직 방향으로 구성됩니다. 


예제에서는 horizontal (수평) 으로 설정하여 두개의 자식 LinearLayout 을 가지도록 설정했습니다. 


여기서 특이하게 layout_width 를 0dp 로 설정하고 weight 라는 속성 값을 둘다 동일하게 1 로 적용했습니다. 

이는 길이를 두개의 LinearLayout 이 똑같이 1:1 로 나눈다는 의미입니다. 

만약 한쪽이 weight="2" 다른 한쪽이 weight="1" 로 설정이 되었다면 부모 LinearLayout 내에서 화면을 2:1 로 나누게 됩니다. 


주의 할 점은 부모 LinearLayout 의 orientation 이 horizontal 이면 길이 방향으로 weight 값이 적용되고 

부모 LinearLayout 의 orientation 값이 vertical 이면 높이 방향으로 weight 값이 적용됩니다. 



Example 3

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp"
android:padding="10dp"
android:background="@android:color/holo_orange_light"
android:orientation="horizontal">
<LinearLayout
android:layout_width="100dp"
android:layout_weight="1"
android:layout_height="30dp"
android:background="@android:color/holo_purple">

</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="30dp"
android:background="@android:color/holo_green_light">

</LinearLayout>
</LinearLayout>

예제 2번과 동일한 구조이지만 width 값만 100dp VS 0dp 로 잡았습니다. 

이경우 한쪽은 100dp 만큼 또 다른 한쪽은 0dp 만큼 길이를 가진채 나머지 남은 길이를 1:1 로 배분하게 됩니다. 

예를 들어 부모 LinearLayout 의 길이가 400dp 라고 했을때 위와 같은 경우 왼쪽은 100dp + 150dp 오른쪽은 150dp 의 길이를 가지게 된다는 것을 보여주는 예제 입니다. 



Example 4

<LinearLayout
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#58ac92"
android:gravity="center"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp">

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="gravity center"
android:textSize="10dp"/>

</LinearLayout>

이번 예제에는 부모 LinearLayout 에 gravity 라는 속성 값을 추가 했습니다. 

이는 부모 LinearLayout 내부에서 자식 뷰의 위치를 지정하는 속성값으로 center / right / left / bottom / top 등의 값들이 있으며 서로 상반되는 값이 아니라면 "|" 기로를 이용하여 동시 적용이 가능합니다. 

4번 예제는 gravity 값을 center 로 지정하여 자식뷰인 버튼이 레이아웃의 한 가운데 들어 오게 한 예제 입니다. 



Example 5

<LinearLayout
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#58ac92"
android:gravity="right|bottom"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp">

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="gravity right and bottom"
android:textSize="10dp"/>

</LinearLayout>

예제 4번 설명중 언급한 부분인데요. 

gravity 값을 "|" 기호를 이용하여 설정한 예제 입니다. 

gravity="right|bottom" 으로 설정하여 자식뷰를 부모뷰의 오른쪽 아래 방향에 위치하도록 설정했습니다. 



그 외에도 많은 속성 값들이 있지만 특히 많이 사용하는 속성 값들을 이용하여 예제를 작성 하였습니다. 


LinearLayout 을 이해하는데 많은 도움이 되었길 바라며 다음에는 RelativeLayout 에 대해 준비해 보겠습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안녕하세요. 제임스 입니다. 


이번에는 안드로이드 레이아웃의 죵류와 속성에 대한 내용을 정리 해보겠습니다. 




일전에 View 와 ViewGroup 에 대해 간단히 정리를 했는데요. 


얼핏 보기에는 ViewGrop 이 View 보다 상위 객체 같이 보여 지지만 실제로는 View 가 ViewGroup 의 상위입니다. 


ava.lang.Object

↳ android.view.View

↳ android.view.ViewGroup


ViewGroup 은 View 를 상속받고, View 는 java 의 Object 를 상속 받습니다. 

참고 해주세요 :)



■ 안드로이드 레이아웃 종류


안드로이드에는 여러 종류의 레이아웃이 제공되고 있습니다. 

이 레이아웃들은 모두 ViewGroup 의 서브 클라스로 ViewGroup 을 상속받고 있습니다. 


1. Linear Layout

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.LinearLayout


리니어 레이아웃은 수직 또는 수평의 한방향으로 자식 뷰를 배치하는 형태 입니다. 각 자식뷰에 가중치(weight)를 설정하여 해당 자식뷰가 다른 자식뷰에 비해 얼마나 많은 레이아웃 공간을 차지할 것인가를 결정합니다. 


2. Relative Layout

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.RelativeLayout


자식 뷰들을 상대적인 위치 정보를 설정하여 배치 시키는 형태 입니다. Linear Layout 과 함께 가장 많이 사용되어지고 있는 레이아웃 형태 입니다. 


3. Table Layout

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.LinearLayout

↳ android.widget.TableLayout


자식 뷰들을 격자형태의 행과 열로 배치 하는 형태 입니다. HTML 의 table tag 와 비슷한 형태라고 생각 하시면 됩니다. 


4. Absolute Layout

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.AbsoluteLayout


모든 뷰를 특정 XY 좌표에 위치하게 하는 형태 입니다. 화면 크기나 방향 변화 (Landscape - 가로모드 / Portrait - 세로모드) 에 대응하지 못하므로 잘 사용하지 않습니다. (저는 개발 중에 단 한번도 사용한 적이 없습니다 ^^)


5. Frame Layout

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.FrameLayout


하나의 뷰를 보여주기 위해 화면 영역을 할당하는 형태 입니다. 뷰는 레이아웃 영역의 좌상단을 기준으로 생성 되므로 여러개의 뷰가 있을 경우 모두 좌상단으로 모여 있어 가장 마지막에 생성한 레이아웃만 제대로 보입니다. 이때는 gravity 를 적용하여 위치를 변경할 수 있습니다. 


6. List View

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.AdapterView<android.widget.ListAdapter>

↳ android.widget.AbsListView

↳ android.widget.ListView


스크롤 가능한 아이템들의 목록을 보여주는 형태로 휴대폰의 전화번호부의 이름 / 전화번호 목록이 바로 리스트뷰 입니다. 


7. Grid View

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.AdapterView<android.widget.ListAdapter>

↳ android.widget.AbsListView

↳ android.widget.GridView


스크롤 가능한 격자형태의 2차원 평면에 아이템을 배치하는 형태 입니다. 포토 갤러리 구성에 가장 많이 사용 되는 뷰입니다. 


8. Scroll View

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.FrameLayout

↳ android.widget.ScrollView


부모 뷰 (Scroll View) 안의 아이템을 스크롤 시켜 주는 형태 입니다.




실제 1, 2 번 Linear Layout 과 Relative Layout 그리고 6 번 List View  이렇게 세가지를 가장 많이 사용하고 있습니다. 

거의 모든 레이아웃은 Linear Layout 한가지 또는 Relative Layout 한가지 만으로 구현이 가능합니다. 

심지어 List View 처럼 스크롤 처리가 되어야 하는 경우는 Scroll View 안에 Linear Layout 이나 Relative Layout 을 추가 해주면 됩니다. 

물론 퍼포먼스 측면에서 보면 위와 같이 처리 하는 것 보다는 ListView 위젯을 사용하는게 훨~~~씬 더 편리하고 효율도 좋습니다. ^^;

그 이유는 이후에 ListView 관련 포스팅 내용을 보시면 짐작 하실 수 있도록 준비 하겠습니다. 


이번에는 레이아웃의 종류에 대해 정리 해봤습니다.

다음 포스팅에서는 레이아웃들의 예제를 이용하여 이해하기 쉽게 정리 해보겠습니다. 


 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안녕하세요. 제임스 입니다. 


이번 포스팅 부터는 사용자 인터페이스와 관련된 내용을 정리 하고자 합니다. 


사용자 인터페이스에는 UI 구성을 위한 레이아웃, I/O 입출력 컨트롤, 이벤트 처리, 대화상자, 알림 등등 많은 내용들이 있습니다. 

그중 UI 를 구성하는 레이아웃에 관한 이야기를 지금부터 시작해 볼까 합니다. 


■ 사용자 인터페이스 레이아웃


안드로이드의 모든 사용자 인터페이스 요소들은 View 와  ViewGroup 객체를 사용하여 구축됩니다. 

View 는 사용자가 상호작용을 할 수 있는 무엇인가를 화면에 그리는 객체입니다. 

ViewGroup 은 인터페이스 레이아웃을 정의하기 위해 다른 View 및 ViewGroup 객체를 보유하는 객체입니다. 



▶ ViewGroup 은 다른 ViewGroup 및 View 로 구성됩니다.


레이아웃을 만드는 방법은 크게 두가지가 있습니다. 

하나는 View 객체를 인스턴스화 하여 구축하는 것과 XML 파일을 이용하여 레이아웃 구조를 만드는 방법입니다. 


개발중에는 XML 파일을 이용하는 방법을 많이 사용하고 있습니다. 


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="com.tutorial.james.androidtutorialtest.MainActivity"
android:orientation="vertical">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="30dp"
android:text="TextView 위젯" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:text="Button 위젯"/>

</LinearLayout>

위 코드는 XML 파일로 구성한 레이아웃입니다. 


LinearLayout 은 ViewGroup 을 상속받는 객체이며 UI 에서 LinearLayout 위젯을 생성합니다.  

(참고 : https://developer.android.com/reference/android/widget/LinearLayout.html )


<TextView>는 UI에서 TextView 위젯을 생성합니다. 

(참고 : https://developer.android.com/reference/android/widget/TextView.html )


<Button>은 UI에서 Button 위젯을 생성합니다. 

(참고 : https://developer.android.com/reference/android/widget/Button.html )



Button 및 LinearLayout 은 android.widget 의 클래스 중 하나임을 보여주는 이미지 입니다 (Android API 참조)


UI 레이아웃에 대한 간략히 개념 잡기로 준비 했습니다. 

UI 레이아웃 생성에 대한 디테일한 내용은 다음 회차에 다루도록 하겠습니다. 



 도움이 되셨다면 로그인이 필요 없는

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,