04-1. View
앱 실행 화면을 구성하는 요소를 뷰라고 통칭한다. 텍스트뷰, 버튼, 라디오버튼, 이미지 등이 모두 속한다.
안드로이드 화면에서 실제로 사용되는 것들은 모두 View 클래스의 상속을 받는다.
View 클래스는 위젯 이라고도 하는데 화면에서는 버튼 위젯, 코드에서는 버튼 클래스 이런 식으로 부른다.
위젯을 담을 수 있는 위젯을 레이아웃이라고 부른다. 레이아웃은 ViewGroup 클래스 안에 존재한다.
위젯은 단독으로 존재하지 않고 위젯을 담아 배치하는 툴이 레이아웃이다.
레이아웃은 위젯을 포함하는 컨테이너 역할로 눈에 보이는 개념이 아니다.
최상위에 Object 클래스가 있고 이를 상속받은 View 클래스가 있다.
레이아웃은 ViewGroup을 상속받은 LinearLayout, RelativeLayout, FrameLayout, GridLayout, TableLayout이 있다.
ListView, GridView, TapHost, Gallery 등 레이아웃이라고 부르지는 않지만 다른 뷰를 포함하는 것들을 View Container(뷰 컨테이너)라고 부르고 뷰 컨테이너도 ViewGroup 클래스에서 상속 받는다.
View 클래스가 모든 위젯의 부모 클래스이기 때문에 위젯과 레이아웃 등은 모두 View 클래스의 속성과 메소드를 상속받는다.
developer.android.com/reference/packages 에서 자세히 확인할 수 있다.
여기서 필요한 위젯을 누르면 해당 위젯의 상속 관계도와 설명을 볼 수 있다.
자주 사용되는 View 의 속성을 몇 개 확인해보자.
- id
모든 위젯의 아이디를 나타내는 속성으로 Java 코드에서 버튼 등의 위젯에 접근할 때 id 속성에 지정한 아이디를 사용한다.
ex) findViewById(R.id.위젯id)
일반적으로 id 속성은 위젯에 아이디를 새로 부여하는 개념이기 때문에 @+id/아이디이름 의 형태로 지정한다.
버튼이나 체크박스 같은 위젯은 일반적으로 클릭했을 때 어떤 행동을 하기 위한 것이기 때문에 id를 지정하지만, 아무런 동작이 필요없는 텍스트뷰나 이미지뷰 같은 경우 굳이 id 속성을 지정하지 않아도 된다. (==java 코드에서 사용하지 않는다면 필요x)
- layout_width/ layout_height
모든 위젯에 필수로 들어가야 하는 속성이다. 각 위젯의 폭과 높이를 나타내며 match_parent/wrap_content로 설정할 수 있다.
> match_parent : 자신의 부모(ex.레이아웃)에 폭이나 높이를 맞춘다 (android 2.1이하는 fill_parent로 사용)
> wrap_content : 자신의 폭이나 높이를 자신 안의 글자가 꼭 들어갈 정도로만 설정
> 숫자(px단위)
* 위젯 크기 지정 단위 : in, mm, pt, dp, sp 등
위젯 크기 단위는 직접 지정할 수 있다.
dp(Density-independent Pixel): 화면 밀도에 독립적으로 사용되는 단위(안드로드의 해상도와 무관하게 같은 비율로 출력)
sp(Scaled Pixel): 폰트를 지정할 때 자주 사용
- background
위젯의 색상을 주로 #RRGGBB 값으로 지정한다.
#AARRGGBB 방식도 사용 가능한데 AA는 알파 값으로 투명도를 지정한다. (00:완전투명, FF:불투명)
- padding
위젯의 경계선으로부터 위젯 안의 요소가 떨어지도록 설정 가능(상하좌우 모두에 지정하는 속성)
따로 지정하고 싶을 경우) paddingTop, paddingBottom, paddingLeft, paddingRight
LinearLayout에 패딩 속성을 넣었더니 그 안의 요소들이 경계선에서 30dp만큼 떨어져서 출력되었다.
버튼에 패딩을 주면 버튼 안의 글자가 버튼의 경계선에서 일정 간격 떨어져서 표현된다.
- layout_margin
위젯과 위젯 사이의 간격 설정(상하좌우 모두 포함)
따로 지정하고 싶을 경우) layout_marginTop, layout_marginBottom, layout_marginLeft, layout_marginRight
padding 속성은 자신의 내부에 들어있는 위젯과 자신의 경계선 사이의 간격을 지정한다.
layout_margin 속성은 자신과 부모 레이아웃이나 위젯 사이의 간격, 주위 다른 위젯과의 간격을 지정한다.
( == layout_margin은 각 위젯의 속성으로 지정해야함)
- visibility
위젯을 보일 것인지 여부를 결정한다. visible/invisible/gone 의 상태가 있다.
invisible은 보이지 않을 뿐 원래의 자리는 계속 유지하는 것이고 gone은 안 보이면서 자리까지 내놓은 것이다.
버튼 5개를 만들었고 이중에 버튼2는 invisible, 버튼4는 gone 으로 설정했더니 다음과 같이 보인다.
gone으로 설정된 버튼4는 자리까지 없어진 것을 알 수 있다.
- enabled, clickable (true/false)
enabled: 위젯의 동작 여부
clickabe: 클릭이나 터치 가능 여부
button2는 enabled:false, button3은 clickalbe:false로 설정해줬다.
- rotation
위젯을 회전시켜서 출력하며 값을 각도로 지정한다. (안드로이드 3.0 이후부터 지원)
button3에 rotation:45를 줬다. 오.. 멋진데..
+ 버튼은 background를 설정해도 색이 바뀌지 않았다.
찾아보니 버튼은 default 백그라운드 색깔을 갖고 있기 때문에 android.widget.Button을 사용하라고 한다..
충격 여태까지 내가 Button 하고 만들었던 건 머티리얼 버튼이라고 한다.
<android.widget.Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#60dd06"
android:text="버튼 1" />
이렇게 수정하니까 색깔이 반영됐다.