레이아웃 (Layout) 안드로이드프로그래밍정복 (Android Programming Complete Guide)
2/20 Contents 학습목표 뷰와레이아웃에대해이해하고, 레이아웃을활용, 관리하는여러가지기법들에대하여알아본다. 내용 뷰 (View) 리니어레이아웃 (Linear Layout) 다른레이아웃 레이아웃관리
3/20 1. 뷰 (View) 뷰의계층 안드로이드응용프로그램의화면을구성하는주요단위인액티비티는화면에직접적으로보이지않으며, 액티비티안의뷰가사용자를대면하는실체이다. 여러개의뷰가모여하나의액티비티를구성하고, 이러한액티비티가모여하나의응용프로그램이된다. 레이아웃은액티비티안에뷰를배치하는기법을말한다. 뷰 위젯 : 직접적으로보이며사용자인터페이스를구성하며, 흔히컨트롤이라고부른다. 뷰그룹 : 뷰를담는컨테이너역할을하며, 이부류의클래스들을레이아웃이라고한다. 뷰그룹이면서도위젯처럼사용되기도하는클래스도있으며, 특정위젯을상세히알고싶다면그슈퍼클래스들부터연구해야한다. 서브클래스는슈퍼클래스의모든속성을상속받는다.
4/20 1. 뷰 (View) 위젯의계층 View 도자바클래스의일종이므로루트인 Object 로부터파생된다. View 로부터직접파생되는모든클래스가바로위젯이며스스로를그릴수있는능력을가지고있다. Object AnalogClock EditText AutoCompleteTextView View TextView Button CompoundButton Chronometer CheckBox DigitalClock RadioButton ImageView ImageButton ToggleButton SurfaceView GLSurfaceView VideoView SeekBar ProgressBar AbsSeekBar RatingBar
1. 뷰 (View) 뷰그룹의계층 View 로부터파생된 ViewGroup 의서브클래스이다. 다른뷰들을차일드로포함하며차일드를정렬하는기능을가진다. Object FrameLayout ScrollView, HorizontalScrollView View TabHost, TimePicker, DatePicker ViewGroup AbsoluteLayout ViewAnimator WebView ViewFlipper ViewSwitcher TextSwitcher ImageSwitcher RelativeLayout LinearLayout RadioGroup, ZoomControls TableLayout, TableRow TabWidget AdapterView AbsListView AbsSpinner ListView GridView Spinner Gallery 5/20
6/20 1. 뷰 (View) View 의속성 id 뷰를칭하는이름을정의하며, 코드나 XML 문서에서뷰를참조할때 id 를사용하므로직관적인이름을붙이는것이좋다. 형식 : @[+]id/id - @ : id 를리소스 (R.java) 에정의하거나참조한다는뜻이며, 무조건붙여야한다. - + : ID 를새로정의한다는뜻이며, 참조시는생략가능하다. - id : 예약어 - / : 뒤에원하는이름을작성하되, ID 는고유한명칭이므로명령규칙에맞아야하며, 뷰끼리중복되어서는안된다. ex) android:id= @+id/name : 텍스트뷰에 name 이라는 id 를부여함. XML 문서에 ID 를지정하면이이름이 R.java 에정수형상수로정의된다. 코드에서뷰를참조할시 findviewbyid 메서드호출, 인수로참조할뷰의 id 를전달한다. 모든뷰에 id 를의무적으로지정할필요는없으며, 코드에서참조할필요없는위젯은보통 id 를생략한다.
7/20 1. 뷰 (View) View 의속성 layout_width, layout_height 뷰의폭과높이를지정하며, 수평, 수직각방향에대해크기를지정할수있다. 속성값으로아래의세가지중하나의값을가진다. - fill_parent : 부모의주어진크기를다채운다. - wrap_content : 내용물의크기만큼만채운다. - 정수크기 : 지정한크기에맞춘다. ex) Start 라는캡션을가지는버튼배치 지정한크기가액면대로다받아들여지지않으며, 주위다른위젯들의크기에영향을받는다. 명시적인크기지정시정수하나와단위를지정하는예약어를같이사용하며, 이이단위는크기를지정하는모든속성에공통적으로적용된다. 단위 : px, in, mm, pt, dp ( 또는 dip), sp ( 또는 sip)
8/20 1. 뷰 (View) View 의속성 background 뷰의배경을지정하며, 색상및이미지등의여러가지객체로지정가능하다. 색상지정시네가지형식이적용되며, 배경뿐만아니라색상을지정하는모든속성에적용된다. - #RGB - #ARGB - #RRGGBB - #AARRGGBB ex) #ff0000 (#f00): 빨간색, #0000ff : 파란색 padding 뷰와내용물간의간격을지정한다. ( 즉안쪽여백 ) padding 속성값을지정하여 4방향에대한여백을조절할수있다. 속성값 : paddingleft, paddingtop, paddingright, paddingbottom
9/20 1. 뷰 (View) View 의속성 visibility 뷰의표시유무를지정하며, 속성값으로아래의세가지중하나의값을가진다. - visible : 보이는상태임. - invisible : 숨겨진상태이되자리는차지함. - gone : 숨겨지며자리도차지하지않음. clickable, longclickable 마우스클릭이벤트를받을것인지, 롱클릭이벤트를받을것인지를지정한다. - click : 손가락으로뷰를누름 - longclick: 손가락으로뷰를누른채잠시기다림 진위형이므로 true 또는 false 둘중하나의값을지정한다. focusable 키보드포커스를받을수있는지를지정한다. 디폴트값으로 false가설정되어있으며, 필요시속성을 true로변경한다. 에디트나버튼처럼사용자의입력이필요한파생클래스는디폴트로 true가지정되어있다.
10/20 1. 뷰 (View) TextView 문자열출력및입력받는위젯 입력기능은숨겨져있으며서브클래스인 EditText 에서활성화된다. text 텍스트뷰의가장중요한속성으로출력할문자열을지정한다. 리터널및리소스로대입한다. 문자열 형식 @[ 패키지 :]type:name 설명 겹따옴표로문자열을싸서바로대입한다. \ 문자가들어가면이스케이프된다. \n 은개행이며 \uxxxxx 는유니코드문자이다. 리소스에대한레퍼런스로지정한다. 보통 string.xml 에문자열을정의해놓고 @string/id 식으로지정한다.?[ 패키지 :][type:]name 테마속성으로지정한다. textcolor 문자열의색상을지정하며, 디폴트는불투명한밝은회색이다. #RRGGBB 나 #AARRGGBB 형식으로각색상요소들의강도를지정한다.
11/20 1. 뷰 (View) TextView textsize 텍스트의폰트크기를지정하며, 실수타입으로지정할때숫자뒤에 sp, dp, px, in, mm 등의단위를같이지정한다. textstyle 폰트의속성을지정한다. normal, bold, italic 중하나를쓰거나 로묶어두개이상의상수값을지정할수있다. ex: bold italic, normal italic typeface 글꼴의모양을지정하며, normal, sans, serif, monospace 중하나로선택가능하다. 모바일환경에서내장된폰트개수에제약이있다. width, height 텍스트뷰의폭과높이이며크기값과단위를같이지정한다. 텍스트뷰는단독으로존재하는경우는거의없고대부분레이아웃안에서차일드로존재하기때문에이두속성은거의사용되지않는다.
1. 뷰 (View) TextView singleline 텍스트가위젯의폭보다길때강제로한줄에출력한다. 속성의디폴트는 false 로폭보다더긴줄은자동으로아래쪽으로개행된다. [ TextView 예제실행결과 ] string.xml <?xml version= 1.0 encoding= utf-8 > <resources> <string name= hello >Hello World, TextViewTest!</string> <string name= app_name >TextViewTest</string> <string name= insa >Hello</string> <string name= anyoung > 안녕하세요 </string> </resources> main.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent > android:text= @string/insa android:textcolor= #ff0000 android:textsize= 20pt android:textstyle= italic /> android:text= @string/anyoung android:textsize= 20sp android:background= @0000ff /> android:text= Good Morning android:textcolor= #8000ff00 android:textsize= 5mm android:typeface= serif /> </LinearLayout> 12/20
13/20 1. 뷰 (View) ImageView 아이콘이나비트맵을출력하는위젯으로, 리소스, 파일등은물론이고컨텐트프로바이더나웹상의이미지로도표시가능하다. src 출력할이미지를지정하는가장중요한속성이다. 주로리소스에이미지를복사해두고 @drawable/id 형식으로이미지를출력하는방법을사용한다. maxheight, maxwidth 이미지가출력될최대크기를지정한다. adjustviewbounds 이미지의종횡비를맞추기위해이미지뷰의크기를적당히조정할것인가를지정하며, 속성값은 true 나 false 중하나를사용한다. 그외 croptopadding, tint, scaletype
1. 뷰 (View) ImageView jpg, png, gif 등의이미지포맷을지원한다. SDK 1.6 이후밀도별로세개의폴더가존재하며, 해상도별로각폴더에이미지를넣어두면운영체제가사용할이미지를결정한다. Layout/imageviewtest.xml 고해상도이미지 저해상도이미지 중해상도이미지 [ ImageView 예제실행결과 ] <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent > <ImageView android:src= @drawable/pride /> <ImageView android:src= @drawable/pride android:maxheight= 70px android:maxwidth= 120px android:adjustviewbounds= true /> <ImageView android:src= @drawable/dog android:tint= #4000ff00 /> </LinearLayout> 14/20
15/20 1. 뷰 (View) Button, Edit View, TextView의서브클래스이며고유의속성은따로가지지않는다. Button : 사용자로부터명령을입력받음 EditText : 문자열을입력받음 ( 에디트 ) Layout/buttonedit.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent > <EditText android:id= @+id/edit android:text= 여기다입력 /> <Button android:id= @+id/btn android:text= 입력완료 /> </LinearLayout>
16/20 2. 리니어레이아웃 LinearLayout 차일드뷰를수평, 수직으로일렬배치하는레이아웃으로, 가장단순하면서직관적이며사용빈도가높다. orientation 뷰의배치방향을결정하는속성. ( 디폴트는 horizontal) vertical : 차일드를위에서아래로수직으로배열 horizontal : 차일드를왼쪽에서오른쪽으로수평배열 버튼 1 버튼 1 버튼 2 버튼 3 버튼 2 버튼 3 [ vertical ] [ horizontal ]
2. 리니어레이아웃 LinearLayout Layout/Horizontal <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= horizontal android:layout_height= fill_parent > [ Horizontal ] Layout/Horizontal2 android:orientation= horizontal android:text= @string/insa android:textcolor= #ff0000 android:textsize= 20pt android:textstyle= italic /> [ Horizontal2 ] Layout/Horizontal3 android:text= @string/insa android:textcolor= #ff0000 android:textsize= 20pt android:textstyle= italic /> [ Horizontal3 ] 17/20
18/20 2. 리니어레이아웃 gravity 내용물의위치를지정하며, 수평, 수직방향에대해각각정렬방식을지정할수있다. 두속성을같이지정할때는 연산자를이용하며, 이때연산자양쪽으로공백이전혀없어야한다. 각정렬방식은비트필드로정의, center, fill 은수평, 수직정렬상태플래그의조합으로정의되어있다. 상수값설명 center_horizontal 0x01 수평으로중앙에배치한다. left 0x03 컨테이너의왼쪽에배치하며, 크기는바뀌지않는다. right 0x05 컨테이너의오른쪽에배치한다. fill_horizontal 0x07 수평방향으로가득채운다. center_vertical 0x10 수직으로중앙에배치한다. top 0x30 컨테이너의상단에배치하며, 크기는바뀌지않는다. bottom 0x50 컨테이너의하단에배치한다. fill_vertical 0x70 수직방향으로가득채운다. center 0x11 수평으로나수직으로중앙에배치한다. fill 0x77 컨테이너에가득채우도록수직, 수평크기를확장한다.
2. 리니어레이아웃 gravity Layout/gravity1.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent > android:layout_height= fill_parent android:text= 정렬테스트 android:textsize= 30pt android:textcolor= #00ff00 /> </LinearLayout> Layout/gravity2.xml android:layout_height= fill_parent android:text= 정렬테스트 android:textsize= 30pt android:textcolor= #00ff00 android:gravity= center /> Layout/gravity3.xml android:layout_height= fill_parent android:text= 정렬테스트 android:textsize= 30pt android:textcolor= #00ff00 android:gravity= center_vertical /> 19/20
20/20 2. 리니어레이아웃 gravity Layout/lgravity1.xml android:layout_height= fill_parent android:text= 정렬테스트 android:textsize= 30pt android:textcolor= #00ff00 android:background= #ff0000 android:layout_gravity= center /> Layout/lgravity1.xml android:text= 정렬테스트 android:textsize= 30pt android:textcolor= #00ff00 android:background= #ff0000 android:layout_gravity= center /> [ lgravity1 width 만변경 ] [ lgravity1 width, height 모두변경 ]
2. 리니어레이아웃 gravity Layout/lgravity2.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent android:gravity= center > android:text= 정렬테스트 android:textsize= 30pt android:textcolor= #00ff00 android:background= #ff0000 /> </LinearLayout> Layout/lgravity3.xml [ lgravity2 ] [ lgravity3 ] <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent android:gravity= center > android:text= 정렬테스트 android:textsize= 30pt android:textcolor= #00ff00 android:background= #ff0000 /> <Button android:layout_heigth= wrap_content android:text= 버튼이다. /> </LinearLayout> 21/20
22/20 2. 리니어레이아웃 gravity Layout/lgravity4.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent android:gravity= center > android:text= 정렬테스트 android:textsize= 30pt android:textcolor= #00ff00 android:background= #ff0000 android:layout_gravity= center_horizontal android:gravity= right bottom /> </LinearLayout> [ lgravity4 ]
23/20 2. 리니어레이아웃 baselinealigned 높이가다른차일드뷰를수평으로정렬시하단정렬지정 ( 디폴트 true) Layout/base1.xml ~ base2.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= horizontal android:layout_height= fill_parent android:baselinealigned= ture > android:text= Medium android:textsize= 10pt /> android:text= Small android:textsize= 5pt android:background= #0000ff /> android:text= Large android:textsize= 20pt android:typeface= serif /> </LinearLayout> [ base1 ] [ base2 ]
24/20 2. 리니어레이아웃 layout_weight 중요도에따라차일드의크기를균등분할한다. 중요도가 0 이면자신의고유한크기만큼, 1 이상이면형제뷰와의비율에따라부모의영역을균등하게배분한다. Layout/weight1.xml ~ weight2.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent > <Button android:text= 위쪽버튼 android:layout_weight= 1 /> <EditText android:text= 가운데에디트 android:layout_weight= 3 /> <Button android:text= 아래쪽버튼 android:layout_weight= 1 /> </LinearLayout> [ weight1 ] [ weight2 ]
25/20 2. 리니어레이아웃 layout_weight Layout/weight3.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent > <Button android:layout_height= 64px android:text= Tool Bar android:layout_weight= 0 /> <EditText android:layout_height= fill_parent android:layout_weight= 1 /> <Button android:layout_height= 64px android:text= Menu Bar android:layout_weight= 0 /> </LinearLayout> [ weight3 ]
26/20 2. 리니어레이아웃 padding, margin 여백과관련된속성 padding 뷰와내용물간의간격지정 뷰의입장에서볼때안쪽여백을뜻하며뷰자체의속성 4 면모두동일한여백이지정되며, paddingleft, paddingtop, paddingright, paddingbottom 으로 4 면의개별여백지정가능 margin 뷰와부모와의간격을지정하며, 근처에형제뷰가있으면동일한간격으로여백생성 뷰의입장에서볼때바깥여백을뜻하며레이아웃의속성 4 면모두동일한여백이지정되며, layout_marginleft, layout_marginright, layout_margintop, layout_marginbottom 으로 4 면의개별여백지정가능 마진 마진 패딩 패딩 Button
2. 리니어레이아웃 padding, margin Layout/padding2.xml <LinearLayout android:background= #ff0000 android:layout_margin= 10px > Layout/padding3.xml <LinearLayout android:background= #ff0000 android:layout_margin= 10px android:padding= 10px > Layout/padding1.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent > <EditText android:text= Upper Text /> <LinearLayout android:background= #ff0000 > <Button android:text= Button /> </LinearLayout> <EditText android:text= Lower Text /> </LinearLayout> [ padding2 ] [ padding3 ] [ padding1 ] 27/20
28/20 3. 다른레이아웃 RelativeLayout 위젯과부모와의위치관계또는위젯끼리의관계를지정함으로써뷰를배치 위젯끼리의관계지정을위하여기준이되는위젯에 id 를반드시지정해야한다. 리소스컴파일러는빠른배치를위해위젯간의관계를한번에 (one pass) 읽으며, 특정뷰가다른뷰의위치에종속적일때기준이되는뷰를먼저정의해야한다. ex: A 를 B 의위에배치하고싶다면 XML 문서상에 B 를먼저기술한후 A 를나중에기술해야한다. A B <RelativeLayout> <B android:id= @+id/b /> <A layout_above= @id/b /> </RelativeLayout> [ 원하는배치 ] [ XML 문서 ]
29/20 3. 다른레이아웃 RelativeLayout Layout/relative1.xml <?xml version= 1.0 encoding= utf-8 > <RelativeLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical > android:id= @+id/chulsoo android:layout_marginright= 20px android:textsize= 15pt android:text= 철수 /> android:id= @+id/younghee android:layout_torightof= @id/chulsoo android:textsize= 15pt android:text= 영희 /> [ relative1 예제실행결과 ] android:id= @+id/mongryong android:layout_below= @id/younghee android:alignparentright= true android:layout_marginleft= 10px android:textsize= 15pt android:text= 몽룡 /> android:id= @+id/chunhyang android:layout_torightof= @id/mongryong 철수철수영희철수 android:layout_alignbottom= @id/mongryong 영희철수영희 android:textsize= 15pt android:text= 춘향 /> </RelativeLayout> 레이아웃이배치되는순서 몽룡 춘향 몽룡 좌상단에 철수오른쪽에 영희밑에 부모의오른쪽에 몽룡왼쪽에몽룡의아래쪽정렬
3. 다른레이아웃 RelativeLayout RelativeLayout 예제 name card 좌상단의이미지를제일먼저배치, 그아래삭제버튼을배치한다. 부모의위쪽변에이름을붙이면서동시에이미지의오른쪽에배치한다. 부모의오른쪽에전화번호를붙이되이름과베이스를맞추어가지런히한다. 설명문자열은이름밑에붙이되왼쪽변을이름과나란히맞춘다. [ 정상적인결과 ] [ 베이스를맞추지않은결과 ] RelativeLayout 예제 ListIconText 아이콘, 텍스트, 버튼세개로구성된항목뷰를리스트뷰안에배치한것. 아이콘은왼쪽, 버튼은오른쪽, 사이에텍스트배치 텍스트의길이에상관없이버튼은항상항목뷰의오른쪽에정렬 [ ListIconText ] 30/20
31/20 3. 다른레이아웃 AbsoluteLayout 관계나순서에상관없이지정한절대좌표에차일드뷰를배치한다. 공식문서에는사용을금지하였으며, RelativeLayout, FreamLayout 을사용한다. Layout/absolute.xml <?xml version= 1.0 encoding= utf-8 > <AbsoluteLayout xmlns:android=http://schemas.android.com/apk/res/android android:layout_height= fill_parent > android:layout_x= 50px android:layout_y= 100px android:textsize= 15pt android:text= (50,100) /> android:layout_x= 200px android:layout_y= 70px android:textsize= 15pt android:text= (200,70) /> </AbsoluteLayout>
32/20 3. 다른레이아웃 FrameLayout 차일드를배치하는규칙없이모든차일드는프레임의좌상단에나타나며, 차일드가두개이상일때는추가된순서대로겹쳐서표시된다. ViewGroup 의서브클래스로 addview, removeview 등의메서드로실행중에차일드를추가, 삭제할수있으며, getchildcount 메서드로차일드의개수를조사할수있다. 필요한차일드만표시하고겹쳐진차일드는숨겨둘수있다. 차일드의보임상태는개별뷰의 visibility 속성을사용하여조정하며실행중에도조건에따라뷰의보임상태를변경할수있다. 속성 foreground - 차일드의위쪽에살짝얹히는이미지를지정한다. - 반투명한색상, 이미지사용이가능하다. foregroundgravity - 전경의이미지를배치할방법을지정하며, 디폴트는 fill 이다. measureallchildren - 모든차일드의크기를다측정할것인지, 보이거나숨겨진차일드의크기만적용할것인지를지정한다. - 디폴트는 false 여서 GONE 상태의차일드크기는측정하지않는다.
33/20 3. 다른레이아웃 FrameLayout Layout/frame.xml <?xml version= 1.0 encoding= utf-8 > <FrameLayout xmlns:android=http://schemas.android.com/apk/res/android android:layout_height= fill_parent > <Button android:id= @+id/btn android:text= Push Button /> <ImabeView android:id= @+id/img android:src= @drawable/pride /> </FrameLayout> Layout/frame.java package exam.layout; import android.app.*; import android.os.*; import android.view.*; import android.widget.*; public class Frame extends Activity { public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancesatae); setcontentview(r.layout.frame); } } Button btn = (Button)findViewById(R.id.btn); btn.setonclicklistener(new Button.OnClickListener() { public void onclick(view v) { ImageView img=(imageview)findviewbyid(r.id.img); if(img.getvisibility() == View.VISIBLE) { img.setvisibility(view.invisible); } else { img.setvisibility(view.visible); } } });
34/20 3. 다른레이아웃 TableLayout 표형식으로차일드를배치하는레이아웃으로바둑판모양이다. 테이블은임의개수 TableRow 객체로구성되며, TableRow 안에임의개수열이배치되고, 이를셀이라부르며셀에는차일드뷰하나가들어간다. 테이블의전체크기는행 (TableRow)* 열 ( 셀 ) 이된다. 테이블의차일드들은정해진규칙에따라크기가결정되므로크기속성에대한제약이있다. TableRow 객체의높이는항상 wrap_content 로강제됨. : 여러개의행이한테이블에공존해야하기때문이다. layout_width 속성은따로지정할수없으며항상 fill_parent 로가정됨. : 셀에배치되는자식뷰는무조건주어진셀안에배치되기때문이다. [ TableLayout 예제 ] [ TableLayout 예제 ]
35/20 4. 레이아웃관리 레이아웃중첩 레이아웃은뷰의컨테이너이므로 View 로부터파생된모든객체를레이아웃안에놓을수있으며, 레이아웃자체도 View 의파생클래스이므로레이아웃끼리중첩시킬수있다. 레이아웃중첩예제 NestLayout 제일바깥에 LinearLayout, 전체는수직으로뷰가배열된다. 수직 LinearLayout 안에 TextView, Table, 수평 LinearLayout 이일차차일드로배치된다. Table 은다시 2 행 3 열의셀로분할되고, 각셀에는텍스트뷰가들어있다. 수평 LinearLayout 안에는세개의 TextView 가배치되어있다. TextView TextView TextView TextView 수직리니어 테이블 테이블로우 TextView TextView TextView TextView TextView TextView 수평리니어
36/20 4. 레이아웃관리 레이아웃중첩 레이아웃중첩예제 MultPage 각버튼을누를때프레임내의모든페이지를일단숨긴후버튼에대응되는페이지하나만표시 [ Page 1 button ] [ Page 2 button ] [ Page 3 button ]
4. 레이아웃관리 실행중속성변경 대부분의속성은실행중변경가능하도록메서드를제공한다. 속성값을변경하는메서드의이름은속성이름앞에 set 이붙고속성의첫글자는대문자로시작하며, 인수로전달할값은수평일때 0, 수직일때 1 이다. LinearLayout 클래스 public void LinearLayout.setOrientation(int orientation) gravity 변경메서드 public void TextView.setGravity(int gravity) TextView 속성관련메서드 void settext(charsequence text) void settextcolor(int color) void settextsize(float size) 37/20
38/20 4. 레이아웃관리 실행중속성변경 메서드를호출하기전에속성변경의대상이되는뷰를찾는다 이메서드는액티비티와뷰에정의되어거의모든위치에서호출이가능하다. 호출객체에따라달리사용되며, 액티비티에서호출시전체레이아웃에서검색, 특정뷰에서검색시뷰의차일드중하나를검색한다. View Activity.findViewById (int id) View View.findViewById (int id) ID 로부터 (ById) 대응되는뷰객체 (View) 를찾는다 (find). id 인수로검색대상뷰에지정해놓은 ID 를전달한다.
39/20 4. 레이아웃관리 레이아웃전개 XML 문서에있는레이아웃은 aapt 툴에의해이진형태로컴파일되어실행파일에내장된다. 전개 (Inflation) XML 문서에정의된레이아웃과속성을읽어실제뷰객체를생성하는동작 setcontentview : XML 문서의리소스 ID 를전달받아객체를생성하여액티비티를채움 사용자가직접전개할수있으며, 안드로이드는전개를위해시스템수준에서전개자를따로제공한다. - View inflate (int resource, ViewGroup root) LayoutInflater 클래스의정적메서드로전개자를구할수있다. - 컨텍스트를인수로전달하여전개자를구하고, 이전개자의 inflate 메서드를호출한다. - static LayoutInflater LayouotInflater.from (Context context) View 의정적메서드를이용하여전개할수있다. - static View inflate (Context context, int resource, ViewGroup root)
4. 레이아웃관리 레이아웃파라미터 일반속성 뷰외부와는전혀상관없이뷰자체의속성을지정한다. 주로의미를이해할수있도록직관적인이름을사용한다. 위젯에따라적용가능한종류가변경된다. 레이아웃파라미터 뷰가배치되는부모, 즉레이아웃에소속되는속성, 부모에게차일드뷰를배치할방법을지시한다. 뷰자체의성질을규정하는것이아니라뷰외부와의관계를지정한다. 레이아웃파라미터의이름은 layout_ 으로시작된다. 위젯이아닌소속된부모레이아웃에따라적용가능한종류가변경된다. 레이아웃 파라미터 ViewGroup.LayoutParams ViewGroup.MarginLayoutParams LinearLayout.LayoutParams AbsoluteLayout.LayoutParams RelativeLayout.LayoutParams layout_width, layout_height layout_marginleft, layout_marginright layout_gravity, layout_weight layout_x, layout_y layout_above, layout_alignparentright [ 각레이아웃별로제공되는레이아웃파라미터 ] 40/20
4. 레이아웃관리 레이아웃파라미터 레이아웃파라미터예제 layoutparmeter, marginparameter Layout/layoutparameter.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent android:background= #ffffff android:gravity= center > android:textcolor= #ff0000 android:textsize= 20px android:text= TextVieiw android:background= #00ff00 /> </LinearLayout> Layout/layoutparameter.xml <?xml version= 1.0 encoding= utf-8 > <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation= vertical android:layout_height= fill_parent android:background= #ffffff > <Button android:layout_height= fill_parent android:text= Button With Margin android:layout_margintop= 30px android:layout_marginbottom= 30px /> </LinearLayout> [ layoutparameter 예제 ] [ marginparameter 예제 ] 41/20