01. boostcourse_ android app_ java_view and layout
0. 기초
- 1. layout > activity_main.xml : 사용자가 보여지는 화면 작업
- 2. MainActivity.java : 기능 구현
1. 뷰(view)
- 뷰(view) : 뷰는 안드로이드 기본 화면을 구성하는 모든 기본 화면 구성요소
=> 눈에 보이지 않는 것도 있긴 하지만 눈에 보이는 각각의 것들을 뷰라고 이해하면 쉬움
=> 뷰 중에 눈에 보이지 않는 것들이 있다 보니 눈에 보이는 것들은 위젯, 눈에 보이지 않는 것들은 레이아웃이라고 구분
- 다른 뷰들을 담아둘 수 있도록 뷰그룹을 정의해두었는데 레이아웃은 이 뷰 그룹을 상속
2. 뷰의 크기 속성
- 화면에 추가한 버튼은 눈에 바로 보이는 것이고 그 버튼을 담고 있는 눈에 보이지 않는 것이 레이아웃
- 프로젝트를 처음에 만들면 제약 레이아웃이라는 것이 버튼을 담고 있는 형태로 만들어짐
- 버튼과 제약 레이아웃은 뷰의 한 종류
- 뷰는 화면의 일정 공간을 차지하므로 크기 속성이 필수
3. 레이아웃 종류
- 3-1. 제약 레이아웃(ConstraintLayout) => 기능이 가장 많음 / x-code와 가장 유사(최근 나옴)
- 제약 레이아웃은 프로젝트를 처음 만들었을 때 자동으로 만들어지는 레이아웃
- 자동으로 만들어진 XML 레이아웃 파일인 activity_main.xml 파일을 열어보면 가장 바깥에 있는 최상위 태그가 ConstraintLayout
- 이 최상위 태그는 화면 전체를 담고 있는 레이아웃을 의미
- 그 태그 안에 들어있는 속성 중에 xmlns라는 지시자 : xmlns 지시자에는 상당히 긴 URL이 값으로 설정
=> 이것은 안드로이드 SDK에 들어있는 속성을 사용하겠다는 의미로 해석됨
=> 다만 안드로이드 SDK에 들어있는 속성은 android: 라는 접두어를 붙여서 사용하므로 각각의 속성에 대부분 android: 접두어가 붙게 된다고 이해하면 됨
- 이와 다르게 app라는 속성이 사용되는 경우도 있는데 이것은 여러분이 만든 프로젝트에서 지정한 속성을 사용하겠다는 의미
- 제약 레이아웃은 제약조건을 이용해 그 안에 추가된 뷰들의 위치를 결정 => 그 제약조건은 연결선을 통해 만들어짐
=> 연결선은 뷰의 상, 하, 좌, 우에 있는 연결점을 다른 레이아웃이나 위젯으리 상, 하, 좌, 우와 연결하여 만들 수 있음
- 리니어 레이아웃(Linear Layout)
- 리니어 레이아웃은 박스모델, 박스를 어느방향으로 쌓을건지
- 방향설정, 뷰가 차지할 수 있는 사각형 영역을 할당
- 방향 속성인 orientation 속성을 이용해 가로 방향은 Horizontal, 세로 방향은 Vertical로 지정함
- Linearlayout 이라는 뷰에 필수속성은 크기설정(layout_width, layout_height) / 방향 설정(orientation)
- layout_gravity는 뷰를 정렬하는 데 사용되고 gravity는 뷰 안에 들어있는 내용물을 정렬할 때 사용된다는 점\
- layout_width의 값을 wrap_content로 해놓으면 gravity 속성의 값으로 가로 방향 왼쪽이나 오른쪽으로 정렬하라는 값을 주더라도 정렬은 아무 의미가 없습니다.
=> 움직일 공간이 없기 때문
- 상대 레이아웃(Relative Layout)
- 규칙 기반 모델
- 부모 컨테이너나 다른 뷰와의 상대적 위치로 화면을 구성하는 방법
- Linear layout과 달리 방향 설정은 없어도됨
- 부모와 상대적 위치 :
=> ayout_alignParentTop, layout_alignParentBottom, layout_alignParentLeft, layout_alignParentRight : 위쪽, 아래쪽, 왼쪽, 오른쪽 등 어디에 고정시킬건지 설정 필요
- 부모 레이아웃의 가운데에 배치하기 위한 layout_centerInParent 속성
- 다른 뷰와의 상대적 위치를 지정할 때 사용하는 속성으로는 layout_toLeftOf, layout_toRightOf, layout_alignTop, layout_alignBottom 등이 있음
- 부모 레이아웃과의 상대적 위치를 지정할 때 사용하는 속성들은 모두 Parent 라는 단어가 들어가 있지만 다른 뷰와의 상대적 위치를 지정할 때 사용하는 속성들에는 Parent 라는 단어가 들어가 있지 않음
- button에 위아래에 고정시킬땐 layout_above/below = "@+id~"
- 5. 상대 레이아웃(Relative Layout)
- 규칙 기반 모델
- 부모컨테이너나 다른 뷰와의 상대적 위치로 화면을 구성하는 방법
- 6. 프레임 레이아웃(Frame Layout)
- 싱글 모델
- 가장 상위에 있는 하나의 뷰 또는 뷰그룹만 보여주는 방법
- 여러 개의 뷰가 들어가면 중첩하여 쌓게 됨, 가장 단순하지만
- 여러 개의 뷰를 중첩한 후 각 뷰를 전환하여 보여주는 방식으로 자주 사용함
- ex) Framelayout 안에 전환시킬 이미지뷰 넣어줌
- button 누르면 이미지 전환 방법 : 1. xml파일 button안에 onclick ="" 설정 2.java 파일 수정
- onCreate안에 2번이 들어가있으면 클릭할때 적용이 안되므로 밖으로 변수 선언해줘야함
- 사진마다 index 부여 => 버튼 클릭할때마다 인덱스 값 + 되서 1이되면 다시 index=0으로 치환하게끔 해줘야함
- 1. index 변수 선언 -> 2. 조건문 생성 (숫자 1증가하면 0 다시 변환 / 숫자0일때 이미지1만 보이게하는 설정)
- 7. 테이블 레이아웃(Grid Layout)
- 격자(Grid) 모델
- 격자 모양의 배열을 사용하여 화면을 구성하는 방법
- HTML에서 많이 사용하는 정렬 방식과 유사하지만 많이 사용하지는 않음
4. 뷰의 마진, 패딩 그리고 공간 분할
- 리니어 레이아웃 안에 들어가 있는 뷰가 차지하는 공간은 기본적으로 가로/세로 크기를 지정하는 layout_width와 layout_height 속성에 의해 결정
- 추가적으로 마진을 설정할 수 있음
- 마진(Margin) : 뷰의 테두리선 바깥쪽 공간을 얼마나 띄울 것인지를 지정하는 속성
- 패딩(Padding) : 뷰 안에 들어있는 내용물을 테두리 선과 얼마나 띄울 것인지를 지정하는 속성
5. 뷰의 영역 구분
- 처음 안드로이드 화면을 만들어볼 때 가장 많이 혼동하는 속성이 layout_weight
- 이 속성은 공간분할에 많이 사용
- 예를 들어, 두 개의 버튼을 가로 방향으로 똑같은 크기만큼 반반씩 공간을 차지하도록 만들고 싶을 때 사용
- 이 속성은 남아있는 여유 공간만 분할하기때문에
- layout_width 속성의 값은 0dp 로 주는 것이 필요
- layout_width 속성의 값이 0dp 이고 layout_weight 속성이 각각 1이라면 이 두 개의 버튼은 공간을 반반씩 나누어 가짐