리니어 레이아웃 방향 설정
리니어 레이아웃은 한 쪽 방향으로 뷰를 쌓는다. 따라서 리니어 레이아웃에는 필수 속성으로 방향을 설정해 주어야 한다.
orientation 속성을 사용하고 가로 방향으로 쌓을 때는 horizontal, 세로 방향으로 쌓을 때는 vertical로 설정한다.
디폴트 값은 horizontal인 것 같다. 그래도 가독성을 위해서는 써 주는게 좋을 것 같다.
※ 최상위 레이아웃을 바꾸고 싶을 경우 xml 코드를 바꿔서 수정할 수도 있지만
Convert view를 사용해서 쉽게 바꿀 수 있다.
뷰의 크기 관련 속성
layout_width와 layout_height는 dp로 크기를 지정할 수도 있지만 match_parent, wrap_content로 지정할 수 있다. 이 때, match_parent는 부모의 크기와 똑같이 만들고 wrap_content는 뷰 안에 들어있는 내용물의 크기에 맞게 뷰의 크기를 정해준다.
코드로 화면 구성
소스 파일과 연결시킬 경우 Activity에서는 setContentView(XML파일이름) 메서드로 레이아웃 파일이 소스 파일과 연결된다. 소스 파일과 레이아웃 파일이 분리돼 있으므로 기능과 뷰를 개별적으로 관리할 수 있다는 장점이 생긴다.
이 때, 레이아웃 파일 없이 소스 파일로도 화면을 구성할 수가 있다.
이런 식으로 만들면 똑같은 결과를 얻게 된다.
이 때 context라는 매개변수를 받게 되는 곳이 있는데, 뷰 객체를 만들 때는 항상 Context 객체가 매개변수로 전달되어야 한다. 표준 자바에는 없고, 안드로이드에만 있는 특징이다. 안드로이드 모든 UI객체들은 Context 객체를 전달받도록 되어 있는 것이다. AppCompatActivity 클래스는 Context를 상속하므로 this를 context로 사용할 수 있다.
만일 Context를 상속받지 않는 클래스에서 Context를 사용해야 한다면 getApplicationContext 등과 같은 메서드로 Context를 참조할 수 있다.
※Context란는 어떤 일이 발생한 상황을 의미한다. 프로그래밍 언어에서는 객체의 정보를 담는 객체를 의미하는데,
안드로이드의 뷰에 대한 정보를 확인하거나 설정하도록 뷰의 생성자에 Context 객체를 전달하도록 한다.
소스 코드에서 뷰를 만들어 뷰 그룹에 추가할 때는 LayoutParams 객체를 사용하는데, 뷰의 속성에서 레이아웃과 관련된 속성을 담는다. 여기서는 반드시 가로와 세로 속성을 지정해야하는데, Match_parent 혹은 Wrap_Content를 사용할 수 있고 숫자로 직접 설정할 수도 있다.
addView 메서드로 레이아웃에 뷰를 추가할 수 있다. 이 때 두번째 매개변수로 LayoutParms를 전달할 수도 있다. 이는 뷰를 레이아웃에 추가함과 동시에 LayoutParams를 설정한다는 의미이다.
여기서 나는 왜 레이아웃에는 파라미터를 설정해 주지 않아도 되는지 궁금해졌다.
찾아보니 수직 리니어 레이아웃에서는 디폴트 값이 width가 match_parent이고 height는 wrap_content라고 한다.
이 때 액티비티를 추가로 만들고 싶다면 주의해야 할 점이 있다. AndroidManifest.xml 파일 안에 추가를 해 줘야 앱에서 액티비티를 실행할 수 있다. 프로젝트를 처음 만들었을 때 생기는 MainActivity.java는 자동으로 추가가 된다.
activity 내부 intent-filter는 없어도 상관 없다. 필요한 경우에만 작성하면 된다.
뷰 정렬
리니어 레이아웃 안에 있는 뷰를 방향을 지정해서 정렬할 수 있다. 이 때 gravity라는 속성이 있는데, 두 가지로 나뉜다.
- layout_gravity : 부모의 여유공간 안에서 뷰를 정렬하는 것
- gravity : 뷰 안에 내용물을 정렬하는 것
보통 뷰에 적용되는 속성은 'layout_' 이라는 이름으로 많이 시작된다. 따라서 layout_gravity는 뷰에 적용되는 속성이고
gravity는 'layout_'이라는 이름으로 시작되지 않으므로 뷰 내부 내용물(ex. 버튼 내부 텍스트)에 적용된다.
| 연산자로 여러 개의 속성을 동시에 설정할 수 있다.
wrap_content인 경우에는 뷰를 정렬해야 하므로 layout_gravity 속성을 사용했고
match_parent일 경우에는 뷰 내용물을 정렬해야 하므로 gravity 속성을 사용했다.
반대로 사용할 경우에는 의미가 없어진다.
※ 텍스트뷰나 버튼에서의 텍스트가 높이가 맞지 않을 때가 있다. layout_gravity나 gravity 속성으로 맞추기 힘들다면
레이아웃에서 baselineAligned 속성을 사용하면 해결할 수 있다. (디폴트 값은 true로 설정되어 있다.)
(제약 레이아웃에서는 연결선을 사용해서 쉽게 높이를 맞출 수 있다.)
뷰의 마진과 패딩
뷰는 테두리선을 기준으로 바깥 공간(Margin)과 안쪽 공간(Padding)이 있는데, 이 모든 공간을 포함해서 셀(Cell)이라고 부른다. 뷰는 layout_margin 속성으로 마진을 얼마나 간격을 벌릴지 정할 수 있고, padding 속성으로 패딩을 이용해서 내용물이 테두리선과 얼마나 떨어져 있을지 결정할 수 있다.
layout_weight 속성
layout_weight 속성은 부모 레이아웃에 남아있는 공간을 뷰들에게 분할해서 할당하는 속성이다. 이 때 이 속성은 원래 뷰 크기에 추가되는 크기를 의미한다. 당연히 뷰들의 크기는 wrap_content나 숫자로 지정되어야 한다.
1:400과 1:4000은 큰 차이를 느낄 수 없었다. 아마 일정 비율 이상가면 남은 공간이 미세하게 쪼개지므로 큰 차이가 없어지는 것 같았다. (원래 크기는 어차피 유지되기 때문이다.)
만일 부모 레이아웃에서 원래 크기 없이 비율로 할당하고 싶다면
뷰들의 가로 크기 속성을 0dp로 설정하면 된다.
layout_weight 속성은 부모 레이아웃에서 남은 공간을 할당해 주는데, 뷰들의 가로 크기를 0dp로 설정하면 당연히 부모 레이아웃에서 비율별로 할당하는 것이 되므로 뷰들에게 비율대로 할당할 수 있다.
'안드로이드 > 개념' 카테고리의 다른 글
[Android] 스크롤 뷰, Scroll View (0) | 2021.07.25 |
---|---|
[Android] 프레임 레이아웃, Frame Layout (0) | 2021.07.21 |
[Android] 테이블 레이아웃, Table Layout (0) | 2021.07.21 |
[Android] 상대 레이아웃, Relative Layout (0) | 2021.07.20 |
[Android] 레이아웃의 종류 (0) | 2021.07.19 |