레이아웃 소개

리니어 레이아웃
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button2"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button3"/>
</LinearLayout>
독립적으로 위치를 지정하는 layout_gravity 속성 알아보기
orientation은 레이아웃 속성 자체에 값을 주어 종속된 모든 뷰가 영향을 받았다. 이번에는 리니어 레이아웃 안에 있는 뷰에 layout_gravity 속성을 주어 본다.

리니어 레이아웃의 방향이 horizontal이라면 layout_gravity의 값에서 start 대신 top을, end 대신 bottom을 쓰면 된다.
비중을 지정하는 layout_weight 속성 알아보기
버튼 3개를 1:2:1 비율로 부모 레이아웃의 가로에 꽉차게 배치하고 싶을 때 layout_weight를 사용하면 된다. 쉽게 생각해보면 각 크기에 가중치를 둔다고 생각하면 된다.

가로 길이가 match_parent이고, 세로 길이가 match_parent인 리니어 레이아웃을 만들고, 그 태그 안에 weightSum 속성을 추가한다. weightSum은 weight의 총합을 지정해주는 것이다. 즉 꽉 찬 가로의 길이를 weightSum에 지정을 해주는 것이다. 비율이 1:2:1이라면 모두를 합한 4를 지정해주면 된다.
각 버튼의 속성에 더 이상 가로 크기를 명시적으로 지정해주지 않으니 0dp라고 해준다. 레이아웃에서 뷰가 정해진 고정 값이 아닌 경우에는 0dp를 넣어준다. 그리고 layout_weight를 비율에 맞게 지정해주어야 한다.
만약 weightSum의 값을 6으로 바꾸면 어떻게 될까? 6중의 4만큼만 채워지고, 나머지는 여백으로 비워둔다. 이런 방식으로 layout_weight와 weightSum을 이용하면 원하는 대로 여백까지 조정할 수 있다.
상대적 레이아웃

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:text="parent\nstart"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:text="parent\nend"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="parent bottom"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:text="parent bottom\n + parent end"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="parent\ncenter"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="center\nhorizontal"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="center\nvertical"/>


다른 뷰들이 기준으로 활용할 뷰를 먼저 만들어준다. 기준 뷰가 되는 뷰들은 id값을 부여하여 다른 뷰들이 이용할 수 있게 한다.

이제 앞서 만든 자식 뷰 중 하나를 기준으로 새로운 위치를 지정한다. 기준1 버튼의 오른쪽 아래에 BUTTON1을 위치시키는 코드를 작성한다. 기준2 버튼 오른쪽 위에 BUTTON2를 위치시킨다. 기준3 버튼 왼쪽 위에 BUTTON3을 위치시킨다.
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/standard_1"
android:layout_toRightOf="@id/standard_1"
android:text="button 1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/standard_2"
android:layout_toRightOf="@id/standard_2"
android:text="button 2"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/standard_3"
android:layout_toStartOf="@id/standard_3"
android:text="button 3"/>

컨스트레인트 레이아웃: ConstraintLayout
컨스트레인트 레이아웃 기본 속성
app:layout_constraint[내 방향]_to[기준 뷰 방향]Of = "[기준 뷰 ID or parent]"



컨스트레인트 레이아웃에서 마진을 줄 때 주의점
match_constraint 속성

반응형 UI 만들기: Guideline

가이드라인 만들어보기
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="20dp" />

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.4" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.3" />
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#a0cac7"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="@id/horizontal"
android:gravity="center"
android:text="TOP"/>
<TextView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/vertical"
app:layout_constraintStart_toStartOf="parent"
android:gravity="center"
android:background="#ff7e67"
android:text="LEFT"/>
<TextView
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#006a71"
app:layout_constraintStart_toEndOf="@id/vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/horizontal"
app:layout_constraintBottom_toBottomOf="parent"
android:gravity="center"
android:text="RIGHT"/>
</androidx.constraintlayout.widget.ConstraintLayout>
