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

 

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

이번에는 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 등의 프로그래밍 언어를 소개 합니다.

,



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


안드로이드 개발자 사이트를 뒤지다가 좋은 팁을 하나 발견하여 공유 하고자 합니다. 


Making ListView Scrolling Smooth 라는 제목의 개발 가이드 입니다. (원문은 아래 링크 참조)

https://developer.android.com/training/improving-layouts/smooth-scrolling.html


위 링크의 글을 간단히 요약하면...


ListView 스크롤을 부드럽게 유지하기 위한 핵심은 애플리케이션의 메인 스레드를 무거운 작업으로 부터 자유롭게 유지 하는 것입니다. 즉, 저장장치내 검색, 네트워크 통신 또는 SQL 사용등의 무건 작업은 별도의 스레드을 이용하는 것이 키 포인트 입니다. 


사실 특별히 새로운 부분은 아닙니다. 

하지만, 안드로이드 개발을 이제 시작 하시거나 아직 공부하고 계신 분들이라면 꼭 알고 넘어가야 하는 부분이죠. 


메인 스레드에서 하지 않으면 어떻게 사용하느냐??!

바로 background thread 를 이용하는 것입니다. 


위 오피셜 사이트에서 제공하고 있는 샘플 코드 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Using an AsyncTask to load the slow images in a background thread
new AsyncTask<ViewHolder, Void, Bitmap>() {
    private ViewHolder v;
 
    @Override
    protected Bitmap doInBackground(ViewHolder... params) {
        v = params[0];
        return mFakeImageLoader.getImage();
    }
 
    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        if (v.position == position) {
            // If this item hasn't been recycled already, hide the
            // progress and set and show the image
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    }
}.execute(holder);
cs



이외 View Holder 를 이용하여 View 객체를 관리하는 것에 대한 언급도 있습니다. 


이와 관련 해서는 이후 ListView 를 다룰때 한번 정리 하도록 하겠습니다. 



 결론 


무건운 작업은 Main Thread 에서 하지 않고 Background Thread 에서 AsyncTask 를 이용하여 처리 한다 입니다. 




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

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

감사합니다 :D



블로그 이미지

쉬운코딩이최고

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

,

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


최근에 안드로이드 레이아웃에 대한 정리를 하고 있는데요. 

GridLayout 에 대한 내용 정리한 것이 있어 이와 관련하여 GridView 와의 차이점에 해대 정리 해보고자 합니다. 


이름만 보면 참 비슷합니다. 

Grid 라는 공통점이 있으니 실제로 비슷한 기능을 할 것이라는 것 정도는 예상 가능합니다. 

하나는 layout 이고 다른 하나는 view 라고 합니다. 

뭐가 다른 걸까요? 





■ GridView VS GirdLayout 


GirdView 는 2차원 스크롤 격자의 항목을 표시하는 ViewGroup 입니다. 그리드(격자)내 항목들은 해당 뷰와 관련된 ListAdapter 에서 가져 옵니다. 

GirdView 는 ListAdapter 에서 데이터를 가져오므로 메모리에 로드된 데이터만 화면에 표시합니다. GridView 는 ListView 와 같이 더 나은 성능을 위해 자신의 뷰를 재사용하고 재활용합니다. 



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

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

GridLayout 은 안드로이드 API Level 14 에 추가된 레이아웃으로 LinearLayout 과 RelativeLayout 등 다른 레이아웃들의 정렬과 성능문제라는 단점을 보완하기 위해 만들진 레이아웃입니다. 


GridView 와 GridLayout 에 대한 내용을 정리 했는데요. 그럼 차이점을 구체적으로 정리 해보겠습니다. 


1. 화면 스크롤이 가능한가?

GridView (0) / GridLayout (X)

GridView 는 수직방향으로 View 가 넘쳐날 경우 자동 스크롤이 됩니다. 

하지만 GridLayout 은 자동 스크롤이 되지 않습니다. 즉, ScrollView 로 GridLayout 을 감싸지 않는 이상 뷰가 화면 밖으로 나가더라도 스크롤은 불가 합니다. (ScrollView에 대한 내용은 차후 다루도록 하겠습니다.)


2.  Adapter 를 이용하여 데이터를 가져 오는가? 

GridView (0) / GridLayout (X)

GridView 는 화면 구성 시 adapter 를 통하여 데이터를 가져 옵니다. 즉, adapter 를 통하지 않고 다른 데이터를 입력 할 수는 없습니다. 

반대로 GridLayout 은 화면 구조를 정의 하는 것일 뿐 사용자 인터페이스를 구성하는 것은 모두 개발자가 직접 입력을 해야 합니다. 


이상 GridView 와 GridLayout 의 차이점에 대해 정리해봤습니다. 


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

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

감사합니다 :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 등의 프로그래밍 언어를 소개 합니다.

,

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


Android 개발 중에 DP, SP, PX 등의 치수 단위를 많이 보게 됩니다. 

일전에 개념 정리한 내용이 있으니 참조 하시면 좋을 것 같구요.

http://jamesdreaming.tistory.com/41


이번에는 이 단위 변환 방법에 대해 정리해 보겠습니다. 



■ DP 를 PX 로 변환

import android.util.DisplayMetrics;
import android.util.TypedValue;
public static int convertDpToPixels(float dp, Context context) {
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
return px;
}



■ SP 를 PX 로 변환

public static int convertSpToPixels(float sp, Context context) {
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics());
return px;
}



■ DP 를 SP 로 변환???

public static int convertDpToSp(float dp, Context context) {
int sp = (int) (convertDpToPixels(dp, context) / (float) convertSpToPixels(dp, context));
return sp;
}

코드를 위와 같이 작성 하긴 했지만 실제로 사용할 일이 없습니다. 


sp 는 텍스트 사이즈를 정의 할때 사용하고 dp 는 그 이외 모든 사이즈를 정의할때 사용합니다. 

만약 텍스트 사이즈를 dp 로 정의 했다면 문제가 될 수도 있겠지만 sp 로 정의 했다면 특별히 문제가 될 것은 없을 것이며 변환식 자체가 의미 없습니다. 



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

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

감사합니다 :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 등의 프로그래밍 언어를 소개 합니다.

,

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


먼저번에 코틀린을 사용하기 위해 안드로이드 스튜디오 3.0 버전을 설치 했습니다. 

이를 이용하여 개발을 시작 해보도록 하겠습니다. 



모든 프로그램의 기본은 Hello World 찍어 보는건가요? ㅎㅎ

그렇다면 우리도 Kotlin 을 이용하여 첫 Hello World 찍어 보는 것을 목표로 하겠습니다. 


사실 기존 Java 로 개발 할때와 별반 다르지 않습니다. 

File > New > New Project 를 선택 합니다. 


위 다이얼로그 박스가 생성되면 Include Kotlin Support 를 체크 해주시고 Next 를 클릭 하시면 됩니다. 



나머지는 기존 앱 개발 할때와 동일하게 진행 하시면 됩니다. 



모든 설정을 마치고 Finish 를 선택 하면 아래와 같이 팝업창이 뜨면서 프로젝트 생성을 합니다. 




기존에 Java 기준으로 생각하면 MainActivity.java 가 되어야 합니다. 

하지만 코틀린은 MainActivity.kt 가 됩니다. 

확장자가 달라졌죠? 이제 .kt 라는 확장자에 익숙해 져야 합니다 :)


MainActivity.kt

package com.tutorial.james.myfirstkotlinproject

import android.support.v7.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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.myfirstkotlinproject.MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World! (Kotlin)"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

레이아웃을 구성하는 xml 파일은 변화가 없습니다. 


android:text="Hello World! (Kotlin)"

TextView 의 문구를 위와 같이 정하고 실행 시켰습니다. 



결과는 우리가 예상한데로 나옵니다 :D


기존 Java 와 달라진 점은 .java 확장자가 .kt 확장자로 변경 된것 

그리고 해당 .kt 파일내 코드가 자바코드가 아닌 코틀린 언어로 작성 되었다는 것 정도를 제외하고는 특이 사항은 없습니다. 


특별히 어려운 것이 없는 내용이었죠?


다음에는 코틀린 언어에 대하여 차근 차근 정리 해보도록 하겠습니다. 



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

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

감사합니다 :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 등의 프로그래밍 언어를 소개 합니다.

,

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


이번에는 안드로이드 DP 및 DPI 의 개념에 대해 정리 하겠습니다. 


■ Dimension Units (치수, 크기 단위) 

안드로이드 에서 유저 인터페이스를 xml 에서 생성하거나 또는 java 코드로 생성 할 수 있습니다. 이때 크기, 거리, 길이, 넓이, 높이, 마진, 패딩 등등을 표현하기 위해 여러가지 치수, 크기 단위를 사용할 수 있습니다. 


아래는 안드로이드에서 사용하는 기본 단위들입니다. 


px - 화면상의 실제 픽셀입니다. 단일 픽셀의 물리적 크기는 화면 밀도에 따라 달라집니다. 


in - 화면의 물리적 인치 단위 입니다. 단일 인치의 픽셀 수는 화면 밀도에 따라 달라지게 되는데 이는 픽셀수가 화면 밀도에 따라 달라지기 때문입니다. 


mm - in 과 마찬가지로 화면의 물리적 밀리미터 단위 입니다. 1 inch 는 25.4 mm 입니다. 


pt - Point 로 불리며 텍스트의 폰트 사이즈를 의미 합니다. 1 inch 는 72 pt 입니다. 


dp - 단일 dp 의 물리적 사이즈는 모든 화면 밀도에서 거의 동일 합니다. 1 inch 는 거의 160 dp 입니다. 


sp - 비율 독립 픽셀단위로 특별히 텍스트 크기를 위해 사용합니다. 단일 sp 의 물리적 사이즈는 모든 화면 밀도에서 겅의 동일 합니다. 1 inch 는 거의 160 sp 입니다. 


< 이미지 출처 : https://www.captechconsulting.com/blogs/understanding-density-independence-in-android >



■ DPI (Dots Per Inch) 란? 

안드로이드 리소스에서 사이즈 구분을 mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi 등으로 하고 있습니다. 

여기서 dpi 라는 단위에 대해 설명 드리겠습니다. 

DPI (Dots per Inch) 즉, 인치당 들어가는 픽셀을 의미합니다. 


mdpi ---> 48 px

hdpi ---> 72 px

xhdpi ---> 96 px

xxhdpi ---> 144 px

xxxhdpi ---> 192 px 


이 됩니다. 


DPI <---> Pixel 간 변환은 아래 사이트에서 하실 수 있습니다. 

https://pixplicity.com/dp-px-converter/

아래 이미지와 같은 사이트로 DPI 와 PX 사이의 값 뿐만 아니라 다른 단위에 대한 값들도 자동 산정되니 개발 시 참조 하세요.



http://www.gargasz.info/android/

아래 사이트에서도 상기 사이트와 같이 converter 를 제공하고 있으며 dimension uint 에 관한 설명도 같이 보실 수 있습니다. 



■ Density (밀도) & DPI

밀도는 DPI 를 일정 단위로 나눈 것입니다. 

여석 가지 일반화된 밀도는 아래와 같습니다. 


~ 120dpi > ldpi (저밀도) 

~ 160dpi > mdpi (중간 밀도) - baseline

~ 240dpi > hdpi (고밀도) 

~ 320dpi > xhdpi (초고밀도)

~ 480dpi > xxhdpi (초초고밀도)

~ 640dpi > xxxhdpi (초초초고밀도)


MDPI 의 경우 1 sp = 1 px = 1dp 가 되어 기준점이 됩니다. 

이후 HDPI, XHDPI .... 로 올라 갈 수록 sp 대비 dp 비율이 증가 하게 되는 내용을 정리 한 이미지 입니다. 




위 이미지는 안드로이드에서 실제 크기와 밀도가 일반화된 크기와 밀도로 대략적으로 맵핑되는 방식을 보여주고 있습니다. 



다른 화면 크기에 맞게 UI 작업을 하다보면 각 디자인에 최소한의 공간 크기가 필요 합니다. 따라서 위 이미지에서 나타난 각 일반화된 화면 크기는 시스템이 정의하는 최소 해상도를 가지게 됩니다. 이 최소 크기의 단위는 dp 이며 이 경우 시스템이 화면 밀도의 변화를 걱정할 필요가 없습니다. 



현재 사용중인 단말의 DPI 는 아래와 같은 코드를 이용하여 구할 수 있습니다. 

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int deviceDpi = metrics.densityDpi;

deviceDpi 값이 바로 사용중인 단말의 DPI 값입니다. 




이번에는 안드로이드에서 사용하는 기본적인 치수 단위들과 DP 및 DPI 에 대해 정리 했습니다. 

도움이 되었으면 하는 바램과 함께... 저는 이만 잠자리로 :)


블로그 이미지

쉬운코딩이최고

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

,