CH Park
by CH Park

Categories

  • Android Application

Tags

  • Android
  • Android Studio
  • Application
  • Layout


<레이아웃(Layout)>

  • 뷰 중 일반적인 컨트롤 역할을 하는 것을 위젯(Widget)이라고 하며, 뷰그룹 중에서 내부에 뷰들을 포함하고 있으면서 그것을 배치하는 역할을 하는 것을 레이아웃(Layout)이라고 한다.

제약 레이아웃(ConstraintLayout)

  • 제약조건이란 뷰가 레이아웃 안의 다른 요소와 어떻게 연결되는지 알려주는 것으로, 뷰의 연결점(Anchor Point)과 대상(Target)을 연결한다.
  • 타깃 가능 대상
    1. 같은 부모 레이아웃 안에 들어 있는 다른 뷰의 연결점
    2. 부모 레이아웃의 연결점
    3. 가이드라인(Guideline)
  • 대상 뷰와 타깃의 연결점 가능 지점
    1. 위쪽(Top), 아래쪽(Bottom), 왼쪽(Left), 오른쪽(Right)
    2. 가로축의 가운데(CenterX), 세로축의 가운데(CenterY)
    3. 베이스라인(Baseline) -> 텍스트를 보여주는 뷰인 경우에만 적용됨
  • 바이어스는 화면을 비율로 나누어 어느 곳에 위치시킬지를 결정한다. 세로 방향 바이어스(Vertical Bias), 가로 방향 바이어스(Horizontal Bias)를 통해 위치상 치우침을 설정할 수 있다.
  • 여러 개의 뷰를 일정한 기준 선에 정렬할 때는 가이드라인(Guideline)을 사용한다. 이는 뷰의 설정과 같이 설정이 가능하지만 실제 화면 구성 요소는 아니므로 화면에 보이지는 않는다.

리니어 레이아웃(LinearLayout)

  • 박스(Box) 모델을 사용하는 레이아웃으로, 설정되어 있는 방향으로 뷰를 쌓아간다.
  • 방향은 orientation 속성을 이용하여 세로(Vertical) 혹은 가로(Horizontal)로 설정한다.

1. 뷰 정렬 속성

  • layout_gravity: 부모 컨테이너의 여유 공간에 뷰가 모두 채워지지 않아 여유 공간이 생겼을 때 여유 공간 안에서 뷰를 정렬.

baselineAligned: 텍스트뷰나 버튼에 들어 있는 텍스트들이 서로 높이를 맞추도록 하는 속성. 기본적으로 True로 설정되어 있어 각 뷰들의 높이가 자동으로 맞춰진다.

2. 부모 컨테이너 여유공간 분할

  • 부모 컨테이너에 추가한 뷰들의 공간을 제외한 여유 공간은 layout_weight 속성으로 분할할 수 있다.
  • 부모 컨테이너에 a와 b 뷰만이 존재하고, a 뷰에 layout_weight 값을 1, b 뷰에 2를 설정하면, a와 b 뷰를 제외한 여유 공간을 1:2로 분할하여 각 뷰에 할당한다.
  • 단, 뷰의 layout_width와 layout_height는 wrap_content나 숫자값으로 지정되어야 한다. (match_parent일 경우 여유공간이 발생하지 못하므로 예기치 못한 오류가 발생한다.)
  • 부모 컨테이너의 공간 자체를 일정 비율로 나누고 싶다면, 타겟으로 하고 있는 뷰들의 layout_width(or layout_height) 속성의 값을 0dp로 설정해야 한다.

상대 레이아웃(RelativeLayout)

  • 부모 레이아웃과의 상대적 위치 또는 같은 레이아웃 안에 들어 있는 다른 뷰와의 상대적 위치를 이용해 화면을 배치하는 레이아웃.
  • 현재에는 대부분의 기능이 제약 레이아웃에서 구현 가능하고 제약 레이아웃이 추가적인 기능도 포함하므로 많이 사용되지는 않으나, 레이아웃의 성격에 대해 이해는 필요하다.

뷰 배치 속성(부모 컨테이너)

속성 설명
layout_alignParentTop 부모 컨테이너의 위쪽과 뷰의 위쪽을 맞춤
layout_alignParentBottom 부모 컨테이너의 아래쪽과 뷰의 아래쪽을 맞춤
layout_alignParentLeft 부모 컨테이너의 왼쪽 끝과 뷰의 왼쪽 끝을 맞춤
layout_alignParentRight 부모 컨테이너의 오른쪽 끝과 뷰의 오른쪽 끝을 맞춤
layout_centerHorizontal 부모 컨테이너의 수평 방향 중앙에 배치
layout_centerVertical 부모 컨테이너의 수직 방향 중앙에 배치
layout_centerInParent 부모 컨테이너의 수직과 수평 방향 중앙에 배치
layout_alignParentStart 부모 컨테이너의 시작 부분(가장자리)에 맞춤
layout_alignParentEnd 부모 컨테이너의 끝 부분(가장자리)에 맞춤

뷰 배치 속성(다른 뷰)

속성 설명
layout_above 지정한 뷰의 위쪽에 배치
layout_below 지정한 뷰의 아래쪽에 배치
layout_toLeftOf 지정한 뷰의 왼쪽에 배치
layout_toRightOf 지정한 뷰의 오른쪽에 배치
layout_alignTop 지정한 뷰의 위쪽과 맞춤
layout_alignBottom 지정한 뷰의 아래쪽과 맞춤
layout_alignLeft 지정한 뷰의 왼쪽과 맞춤
layout_alignRight 지정한 뷰의 오른쪽과 맞춤
layout_alignBaseline 지정한 뷰와 내용물의 아래쪽 기준선(baseline)을 맞춤

프레임 레이아웃(FrameLayout)

  • 가장 위에 있는 하나의 뷰만 화면에 보여주며, 그 안에 여러 개의 뷰나 뷰그룹을 추가했다면 나머지는 그 아래에 쌓이는 형태.
  • 프레임 레이아웃에서 Visibility 속성을 이용해 뷰 중 일부만을 보이게 하여 전환 효과를 볼 수 있음.
  • 가장 처음 추가된 뷰가 맨 아래에 깔리고 추가되는 뷰들이 차례로 그 위에 중첩된다.
  • 실제로는 뷰페이저(ViewPager)로 더 단순하고 편리하게 뷰 전환이 가능하다.

테이블 레이아웃(TableLayout)

  • 테이블 레이아웃은 그 안에 들어가는 뷰들을 격자 형태로 만들어 주는 레이아웃.
  • 테이블 레이아웃 안에는 TableRow라는 태그가 여러 개 들어가는데 이 태그는 한 행을 의미한다. 각 행마다 추가된 뷰의 개수가 열의 개수가 된다.
  • TableRow의 높이 값은 내부적으로 항상 wrap_content로 설정되어 있어 화면을 꽉 채울 수 없으며, 폭은 내부적으로 항상 match_parent가 되어 있어 가로 공간을 꽉 채우게 된다.
  • TableRow의 뷰들이 가로 공간을 모두 차지하게 하고 싶으면 stretchColumns 속성을 이용하면 된다. 내부 값은 뷰들의 인덱스로, 여기에 포함되어 있는 뷰들이 가로 공간을 차지하게 된다.
    <TableLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stretchColumns="0,1,2"></TableLayout>
    
  • shrinkColumns는 부모 컨테이너의 폭에 맞추도록 각 열의 폭을 강제로 축소한다.
  • layout_span 속성으로 하나의 뷰가 차지할 칼럼 영역을 조정할 수 있다.

스크롤뷰(ScrollView): 어떤 뷰의 내용물이 넘치면 스크롤을 자동으로 만들 수 있게 하는 기능을 담당. 기본적으로 수직방향이며, 수평방향의 스크롤은 HorizontalScrollView를 사용한다.

findViewById: xml 파일 내 뷰의 id 값을 매개인자로 하여 자바 파일에서 해당 뷰를 인지하도록 하는 메소드.