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

 

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

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

,



■ Java Character - Character.isDigit() 함수



isDigit() 함수는 명시된 char 값이 숫자 인지 여부를 판단하여 true 또는 false 값으로 리턴 합니다. 앞서 포스팅한 siLetter() 함수와 반대 기능을 한다고 생각 하시면 됩니다. 



Syntax

public static boolean isDigit ( char ch )

public static boolean isDigit ( int codePoint )



Example

1
System.out.println(Character.isDigit('a'));
cs


입력 값 'a' 가 숫자 인지 여부를 판단하는 코드 입니다. 

당연히 아니죠 ^^


실행 결과 false 가 리턴 됩니다. 



1
System.out.println(Character.isDigit('97'));
cs


입력 값 '97' 이 숫자 인지 여부를 판단하는 코드 입니다. 


실행 결과 true 가 리턴 됩니다. 



1
System.out.println(Character.isDigit(97));
cs


앞선 예제와 달리 char 형'97' 값이 아닌 int 형 97 을 입력 했습니다. 

얼핏 보기에는 97 은 숫자 이니 ture 가 리턴 될 것이라 생각 할 수 있습니다. 


Syntax 에 보시면 두번째 함수의 인자 값이 int codePoint 라고 되어 있습니다. 

이 codePoint 는 Unicode 값으로 소문자 a 를 의미 합니다.

a 는 문자죠? ^^


실행 결과는 예상과 달리 false 가 리턴됩니다. 



Unicode 표는 아래 링크를 참조 하세요

https://en.wikipedia.org/wiki/List_of_Unicode_characters




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

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

감사합니다 :D



블로그 이미지

쉬운코딩이최고

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

,



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


일전에 개발했던 앱을 업데이트 하기 위해 Android Studio 프로젝트를 실행 했습니다. 

음... 그런데 이게... 무슨 일인지...

갑자기 아래와 같이 AAPT2 error 가 발생 합니다. 



위 이미지 텍스트를 그대로 옮긴 내용이 아래에 있습니다. 참조하세요.


Error:java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details

Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details

Error:com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details

Error:Execution failed for task ':app:processDebugResources'.

> Failed to execute aapt



AAPT2 error 발생 원인은 아래와 같습니다. 


▶ 기존 프로젝트 개발을 Android Studio 2.x 에서 진행

▶ 해당 프로젝트를 Android Studio 3.x 에서 개발하려 함

▶ android plugin for gradle 3.0 을 사용 시 AAPT2 가 Default 로 사용하게 설정 되어 짐 (아래 링크 참조 하세요)

https://developer.android.com/studio/build/gradle-plugin-3-0-0.html



AAPT2 error 해결 방법은 아래와 같습니다. 


▶ gradle.properties 파일에 아래 코드를 추가하여 AAPT2 를 비활성화 합니다. 

android.enableAapt2=false


▶ Menu > Build > Rebuild Project 를 실행하여 프로젝트를 다시 빌드 합니다 .

▶아래 이미지와 같이 이쁘게 빌드가 됩니다. 




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

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

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

,



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


저녁에 안드로이드 프로그램 깔작 작업좀 하고자 안드로이드 스튜디오를 켰는데 갑자기 아래와 같은 오류 메세지가 뜹니다. 


Error:Could not find com.android.tools.build:gradle:3.0.0-beta6.

Searched in the following locations:

    file:/C:/Program Files/Android/Android Studio/gradle/m2repository/com/android/tools/build/gradle/3.0.0-beta6/gradle-3.0.0-beta6.pom

    file:/C:/Program Files/Android/Android Studio/gradle/m2repository/com/android/tools/build/gradle/3.0.0-beta6/gradle-3.0.0-beta6.jar

    https://jcenter.bintray.com/com/android/tools/build/gradle/3.0.0-beta6/gradle-3.0.0-beta6.pom

    https://jcenter.bintray.com/com/android/tools/build/gradle/3.0.0-beta6/gradle-3.0.0-beta6.jar

Required by:

    project :



무섭게 왜 이러냐 ㅠㅠ


모든 에러는 에러 메세지에서 원인을 찾을 수 있습니다 :)

com.android.tools.build:gradle:3.0.0-beta6 를 찾을 수 있게 해주면 되겠죠? 


build.gradle 파일을 열어 줍니다. 


build.gradle (AS-IS)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-beta6'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}


buildscript 의 repositories 에 아래 두줄을 추가 해주면 됩니다. 

mavenCentral()
maven { url "https://maven.google.com" }


build.gradle (TO-BE)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
jcenter()
mavenCentral()
maven { url "https://maven.google.com" }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-beta6'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}


파일을 저장 후 아래와 같이 Clean Project 를 해줍니다. 


잠시 기다리면 오류가 나던 부분은 더이상 볼 수 없게 됩니다. 


위와 같은 오류가 발생 한다면 도움이 되시길 바랍니다 :)


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

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

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

,