1) 레이아웃의 기본 개념
안드로이드에서 사용하는 버튼, 텍스트뷰 등의 각종 위젯은 레이아웃이라는 틀 위에 존재해야 한다. 필요한 위젯을 개발자가 원하는 곳에 배치하기 위해 적절한 레이아웃을 사용해야 한다. 레이아웃은 ViewGroup 클래스로부터 상속받으며 내부에 위젯들을 담는 용도로 사용된다. 레이아웃에는 다양한 속성들이 존재한다.
- orientation : 레이아웃 안에 배치할 위젯의 수직 또는 수평 방향을 설정함
- gravity : 레이아웃 안에 배치할 위젯의 정렬 방향을 좌,우 중앙 등으로 설정한다.
- padding : 레이아웃 안에 배치할 위젯의 여백을 설정한다.
- layout_weight : 레이아웃이 전체 화면에서 차지하는 공간의 가중값을 설정하는데, 여러 개의 레이아웃이 중복될 경우 주로 사용한다.
- baselineAligned : 레이아웃 안에 배치할 위젯을 보기 좋게 정렬한다.
2) 레이아웃의 종류
자주 사용되는 레이아웃은 리니어레이아웃(LinearLayout), 렐러티브 레이아웃(RelativeLayout), 프레임 레이아웃(FrameLayout), 테이블 레이아웃(TableLayout), 그리드 레이아웃(GridLayout), 컨스 트레인 트레이 아웃(ConstraintLayout) 등이 있다. 기존의 자바 GUI에서 사용했던 레이아웃도 있고 자바에서는 없었던 새로운 레이아웃도 존재하는 것 같다.
-리니어 레이아웃(선형 레이아웃) : 레이아웃의 왼쪽 위부터 아래쪽 또는 오른쪽으로 차례로 배치한다. 자바에서 FlowLayout과 유사한 형식인 것 같다.
- 렐러티브레이아웃(상대 레이아웃) : 위젯 자신이 속한 레이아웃의 상하좌우 위치를 지정하여 배치하거나 다른 위젯으로부터 상대적인 위치를 지정한다.
- 테이블레이아웃 : 위젯을 행과 열의 개수를 지정한 테이블 형태로 배열한다.
- 그리드레이아웃 : 테이블 레이아웃과 비슷하지만 행 또는 열을 확장하여 다양하게 배치할 때 더 편리하다.
- 프레임레이아웃 : 위젯을 왼쪽 위에 일률적으로 겹쳐서 배치하여 중복되어 보이는 효과를 낼 수 있다. 여러 개의 위젯을 배치한 후 상황에 따라서 필요한 위젯을 보이는 방식에 주로 활용된다. 예를 들면, 프래그먼트를 활용한 개발을 할 경우 사용된다.
-컨스 트레인 트레이 아웃 : 컨스 트레인 트레이 아웃은 렐러티브 레이아웃과 상당히 유사하지만 개발자가 인터페이스를 더욱 풍부한 방식으로 표현할 수 있도록 다양한 방법을 제공한다. 컨스 트레인 트레이 아웃은 Android Studio 2.2 이상부터 원활하게 사용할 수 있다. 가장 최근에 나온 방식이기도 하고, 디자인적인 측면을 고려한다면 컨스 트레인 트레이 아웃이 효과적이라고 한다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".LinearActivity"
android:orientation="vertical">
<!--LinearLayout은 방향성을 가지고있다(orientation)-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="안녕"
/>
<!-- dp : 사용중인 디바이스의 해상도에 맞는 픽셀값을 계산하여 크기를 결정해주는 단위-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="반갑습니다"
android:textSize="30dp"
android:background="#aaf"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="숫자를 입력해주세요"
android:inputType="number"
/>
</LinearLayout>
간단하게 리니어레이아웃을 활용하여 기본적인 위젯들을 배치해보았다. 리니어 레이아웃은 orientation을 작성하여 배치될 위젯의 방향을 정해주어야 한다. 보통 리니어 레이아웃을 통해 디자인을 할 때는 전체 레이아웃을 vertical로 위에서 아래로 배치되도록 하고, 가로로 배치되야할 위젯들이 있다면 그 위젯들을 horizontal으로 작성한 LinearLayout으로 감싸주는 형식으로 많이 코드를 작성한다. 안드로이드의 위젯들에는 반드시 width과 height을 작성해주어야 한다.
- wrap_content : 폭이나 높이가 요소가 딱 들어갈 정도로만 표현된다.
- match_parent : 요소의 크기가 자신의 부모의 크기에 맞게 표현된다.
위의 방식 외에도 직접 값을 입력해주는 방식도 존재한다.
EditText의 inputType은 사용자가 EditText의 무언가를 입력할 타입을 정해주는 것이다.
속성값 | 입력 가능한 값 | 설명 |
none | 모든 문자, 기호, 숫자 입력 가능 | 기본 입력 형식으로 줄바꿈이 가능 |
text | none과 동일하나 줄바꿈이 불가능 | |
textCapCharacters | 입력된 모든 영문이 대문자로 입력됨 | |
textCapWords | 단어의 첫번재 영문이 대문자로 입력됨 | |
textCapSentences | 문장의 첫번째 영문이 대문자로 입력됨 | |
textAutoCorrect | 입력된 단어를 올바른 단어로 수정 가능 | |
textAutoCompelete | 단어를 입력중에 완성된 단어 표시 가능 | |
textMultiLine | 입력 폼에 줄 바꿈이 가능하거나 따로 설정하지 않으면 단일줄의 텍스트로 제한 | |
textlmeMultiLine | 여러줄의 텍스트 입력가능, 키보드에 줄바꿈 키가 표시됨 | |
textNoSuggestions | 입력할 때 사전에 등록되어 있는 어떠한 단어도 표시하지 않음 | |
testUri | URI를 입력 | |
textEmailAddress | 이메일 주소를 입력 | |
textEmailSubject | 이메일의 제목을 입력 | |
textShortMessage | 짧은 메시지를 입력 | |
textLongMessage | 긴 메시지를 입력 | |
textPersonName | 사람 이름을 입력 | |
textPostalAddress | 주소의 우편번호를 입력 | |
textPassword | 비밀번호를 입력, 입력된 문자는 (*)로 표시 | |
textVisiblePassword | 비밀번호를 입력, 입력된 문자가 보임 | |
textWebEditText | 텍스트를 입력, 웹 양식으로 제공됨 | |
textFilter | 다른 텍스트를 필터링하기 위한 문자를 입력 | |
textPhonetic | 발음되는 발음문자를 입력 | |
textWebEmailAddress | 이메일 주소를 입력, 웹 양식으로 제공됨 | |
textWebPassword | 비밀번호를 입력, 웹 양식으로 제공 | |
number | 숫자 | 숫자를 입력받음 |
numberSigned | 숫자 | 부호가 있는 숫자를 입력 |
numberDecimal | .(점) 기호, 숫자 | 소숫점이 있는 소수를 입력 |
numberPassword | 숫자 | 숫자로된 패스워드를 입력 |
phone | - 기호, 숫자 | 전화번호를 입력 |
datetime | -, : 기호, 숫자 | 날짜와 시간을 입력, 날짜는 -, 시간은 :로 구분 |
date | - 기호, 숫자 | 날짜를 입력 |
time | : 기호, 숫자 | 시간을 입력 |