(무)AIA 평생보장 암보험II · 일반암 : 특정암(유방암, 대장암, 전립선암), 기타피부암, 갑상선암, 제자리암 및 경계성종양 이외의 암 3. 1형
4-3. 레이아웃 관리 천안천일고등학교 류빈 . 학습목표 학습내용 2 1. 리니어...
-
Upload
delphia-hood -
Category
Documents
-
view
224 -
download
2
Transcript of 4-3. 레이아웃 관리 천안천일고등학교 류빈 . 학습목표 학습내용 2 1. 리니어...
4-3. 레이아웃 관리천안천일고등학교 류빈
www.skyone.hs.kr
Contents
학습목표
학습내용
2
1. 리니어 이외의 기타 레이아웃을 배치하는 방법을 익힌다 .
2. 레이아웃을 관리하는 고급 기법에 대해 이해한다 .
1. 렐러티브 레이아웃2. Absolute 레이아웃3. Frame 레이아웃4. Table 레이아웃5. 레이아웃 관리
4.3.1. 레이아웃 중첩
3
• 레이아웃은 뷰의 컨테이너이므로 View 로부터 파생된 모든 객체를 레이아웃 안에 놓을 수 있으며 , 레이아웃 자체도 View 의 파생 클래스이므로 레이아웃끼리 중첩시킬 수 있다 .
레이아웃 중첩
TextView
TextView TextView TextView
TextView TextView TextView
TextView TextView TextView
수직 리니어
테이블
테이블 로우
수평 리니어
• 레이아웃 중첩 예제 – NestLayout① 제일 바깥에 LinearLayout, 전체는 수직으로 뷰가 배열된다 .② 수직 LinearLayout 안에 TextView, Table, 수평 LinearLayout 이 일차 차일드로
배치된다 .③ Table 은 다시 2 행 3 열의 셀로 분할되고 , 각 셀에는 텍스트 뷰가 들어있다 .④ 수평 LinearLayout 안에는 세 개의 TextView 가 배치되어 있다 .
4
C04_nestlayout.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" 레이아웃안에 다른 레이아웃을 배치한다 ."/>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#808080"> <TableRow> <TextView android:text=" 국어 "
android:padding="10dip" /> <TextView android:text=" 영어 "
android:padding="10dip" /> <TextView android:text=" 수학 "
android:padding="10dip" /> </TableRow> <TableRow> <TextView android:text="88" android:padding="10dip"
/> <TextView android:text="92" android:padding="10dip"
/> <TextView android:text="76" android:padding="10dip"
/> </TableRow></TableLayout>
C04_nestlayout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1" android:text=" 사자 "/><TextView android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1" android:text=" 호랑이 "/><TextView android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1" android:text=" 코끼리 "/>
</LinearLayout></LinearLayout>
4.3.1. 레이아웃 중첩 – 예제 1
5
C04_multipage.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#ffffff">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content">
<Buttonandroid:id="@+id/btnpage1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Page 1"/>
<Buttonandroid:id="@+id/btnpage2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Page 2"/>
C04_multipage.xml
<Buttonandroid:id="@+id/btnpage3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Page 3"/>
</LinearLayout><FrameLayout
android:layout_width="fill_parent"android:layout_height="fill_parent">
<LinearLayoutandroid:id="@+id/page1"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#ffff00"><TextView
android:layout_width="fill_parent" android:layout_height="wrap_content"android:textColor="#000000" android:text=" 첫 번째 페이지 "/>
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/pride"/>
</LinearLayout>
4.3.1. 레이아웃 중첩 –예제 2
6
C04_multipage.xml
<RelativeLayoutandroid:id="@+id/page2"android:layout_width="fill_parent"android:layout_height="wrap_content"android:visibility="invisible"android:background="#00ff00">
<EditTextandroid:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_alignParentRight="true" android:text=" 두번째 페이지 "/>
<Buttonandroid:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_alignParentBottom="true" android:text="Button"/>
</RelativeLayout>
C04_multipage.xml
<TableLayoutandroid:id="@+id/page3"android:layout_width="fill_parent"android:layout_height="fill_parent"android:visibility="invisible"android:background="#0000ff"><TableRow>
<TextView android:text=" 국어 " android:textSize="30sp" android:padding="10dip" />
<TextView android:text=" 영어 " android:textSize="30sp" android:padding="10dip" />
<TextView android:text=" 수학 " android:textSize="30sp" android:padding="10dip" />
</TableRow><TableRow>
<TextView android:text="88" android:textSize="30sp" android:padding="10dip" />
<TextView android:text="92" android:textSize="30sp" android:padding="10dip" />
<TextView android:text="76" android:textSize="30sp" android:padding="10dip" />
</TableRow></TableLayout></FrameLayout></LinearLayout>
4.3.1. 레이아웃 중첩 –예제 2
7
C04_multipage.java
public class C04_MultiPage extends Activity {View mPage1, mPage2, mPage3;
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.c04_multipage);
mPage1 = findViewById(R.id.page1);mPage2 = findViewById(R.id.page2);mPage3 = findViewById(R.id.page3);
findViewById(R.id.btnpage1).setOnClickListener(mClickListener);
findViewById(R.id.btnpage2).setOnClickListener(mClickListener);
findViewById(R.id.btnpage3).setOnClickListener(mClickListener);
}
C04_multipage.java
Button.OnClickListener mClickListener = new But-ton.OnClickListener() {
public void onClick(View v) {mPage1.setVisibility(View.INVISIBLE);mPage2.setVisibility(View.INVISIBLE);mPage3.setVisibility(View.INVISIBLE);
switch (v.getId()) {case R.id.btnpage1:
mPage1.setVisibility(View.VISIBLE);break;
case R.id.btnpage2:mPage2.setVisibility(View.VISIBLE);break;
case R.id.btnpage3:mPage3.setVisibility(View.VISIBLE);break;
} } };}
4.3.1. 레이아웃 중첩 –예제 2
8
4.3.2. 레이아웃 대체
• 레이아웃끼리는 중첩도 가능한 관계이지만 상호 대체 가능한 관계도 성립한다 .• 앞에 만드 테이블 레이아웃 예제를 리니어로 구현해보자
C04_lineartable.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.an-droid.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 국어 " android:textSize="30sp" an-droid:padding="10dip" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 영어 " android:textSize="30sp" an-droid:padding="10dip" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 수학 " android:textSize="30sp" an-droid:padding="10dip" />
</LinearLayout>
C04_lineartable.xml
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="88" android:textSize="30sp" an-droid:padding="10dip" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="92" android:textSize="30sp" an-droid:padding="10dip" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="76" android:textSize="30sp" an-droid:padding="10dip" />
</LinearLayout></LinearLayout>
각 텍스트 뷰마다 폭과 높이를 일일이 지정해야 한다는 면에서 번거롭다 .
9
4.3.2. 레이아웃 대체
• 왼쪽에 이미지 뷰를 놓고 오른쪽의 아래 위로 텍스트 뷰 두개를 배치했다 . 수평 리니어와
수직 리니어를 중첩 배치할 수도 있고 렐러티브 하나로 배치할 수도 있다 .
• 이 경우는 미세한 면에서 약간씩 차이가 있지만 렐러티브는 중첩없이 하나의
레이아웃만으로 배치해 내므로 속도에 유리하다 .
• 실행 중 차일드가 숨겨질 때 남은 차일드의 정렬이 조정되지 않는점이 리니어보다 불리 .
• 리니어는 겹침을 지원하지 않아 한 차일드가 커지면 아래쪽 차일드가 밀려난다 .
Upper TextViewLower TextView-descrip-tion
10
4.3.3. 실행 중에 속성 변경
• 대부분의 속성은 실행 중 변경 가능하도록 메서드를 제공한다 .• 속성값을 변경하는 메서드의 이름은 속성 이름 앞에 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)
11
C04_codelayout.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mylinear" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><Button android:id="@+id/mybutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 버튼 " /><TextView android:id="@+id/mytext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 문자열 " /><EditText android:id="@+id/myedit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 에디트 " /></LinearLayout>
4.3.1. 레이아웃 중첩 –예제 2
C04_codelayout.java
public class MainActivity extends Activity {
public void onCreate(Bundle savedInstanceS-tate) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}
12
C04_codelayout.xml
public class C04_CodeLayout2 extends Activity {
public void onCreate(Bundle savedIn-stanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.c04_codelayout);
LinearLayout MyLinear=(LinearLayout)findViewById(R.id.mylinear);
MyLinear.setOrientation(LinearLayout.HORIZONTAL);
Button MyBtn = (Button)findViewById(R.id.mybutton);
MyBtn.setTextSize(40);
EditText MyEdit = (EditText)findViewById(R.id.myedit);
MyEdit.setBackgroundColor(0xff00ff00);}
}
4.3.1. 레이아웃 중첩 –예제 2
13
4.3.3. 실행 중에 속성 변경
메서드를 호출하기 전에 속성 변경의 대상이 되는 뷰를 찾는다
이 메서드는 액티비티와 뷰에 정의되어 거의 모든 위치에서 호출이 가능하다 .
호출 객체에 따라 달리 사용되며 , 액티비티에서 호출 시 전체 레이아웃에서 검색 ,
특정 뷰에서 검색 시 뷰의 차일드 중 하나를 검색한다 .
View Activity.findViewById (int id)
View View.findViewById (int id)
ID 로부터 (ById) 대응되는 뷰 객체 (View) 를 찾는다 (find).
id 인수로 검색 대상 뷰에 지정해 놓은 ID 를 전달한다 .
실행 중 속성 변경
14
4.3.4. 레이아웃 전개
• XML 문서에 있는 레이아웃은 aapt 툴에 의해 이진 형태로 컴파일되어 실행 파일에
내장된다
레이아웃 전개
• 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)
전개 (Inflation)
15
C04_inflation.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#cccccc" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:textColor="#ff0000" android:textSize="20px" android:text="TextView" /></LinearLayout>
C04_inflation.java
public class C04_Inflation extends Activity {public void onCreate(Bundle savedIn-
stanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.c04_inflation);
}}
C04_inflation2.java
public class C04_Inflation2 extends Activity {public void onCreate(Bundle savedIn-
stanceState) {super.onCreate(savedInstanceState);
LinearLayout linear = new LinearLayout(this);
linear.setOrientation(LinearLayout.VERTICAL);linear.setBackgroundColor(Color.LTGRAY);
TextView text = new TextView(this);text.setText("TextView");text.setGravity(Gravity.CENTER);text.setTextColor(Color.RED);text.setTextSize(20);
linear.addView(text);setContentView(linear);/* 파라미터 전달LinearLayout.LayoutParams paramlinear
= new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT);setContentView(linear,paramlinear);//*/
}}
4.3.4. 레이아웃 전개
16
4.3.4. 레이아웃 전개
void addView(View child)void addView(view child, int index)void addView(View child, ViewGroup.LayoutParams params)
public void setContentView (int layoutResID)public void setContentView (View view [, ViewGroup.LayoutParams params])
void setContentView (int layoutResID){View v = layoutResID 전개 ;setContentView(v);
}
View inflate (int resource, ViewGroup root)
static LayoutInflater LayoutInflater.from (Context context)static View inflate (Context context, int resource, ViewGroup root)
LinearLayout linear = (LinearLayout)View.inflate(this, R.layout.c04_inflateion, null)setContentView(linear);
setContentView(View.inflate(this, R.layout.c04_inflation, null));
전개 (Inflation)
17
C04_inflation3.xml
public class C04_Inflation3 extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* XML 전개를 직접 하기LayoutInflater inflater = (Lay-
outInflater)getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
LinearLayout linear = (Linear-Layout)inflater.inflate(R.layout.c04_inflation, null);
setContentView(linear);//*/
4.3.4. 레이아웃 전개
C04_inflation3.xml
/* 컨텍스트로부터 전개자 구하기LayoutInflater inflater = Lay-
outInflater.from(this);LinearLayout linear = (Linear-
Layout)inflater.inflate(R.layout.c04_inflation, null);
setContentView(linear);//*/
/* View 의 정적 메소드 사용하여 전개하기
LinearLayout linear = (Linear-Layout)View.inflate(this, R.lay-out.c04_inflation, null);
setContentView(linear);//*/
//* 가장 짧은 전개 코드setContentView(View.inflate(this,
R.layout.c04_inflation, null));//*/
}}
18
C04_mytext.xml
<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/an-droid" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:textColor="#ff0000" android:textSize="20px" android:text="TextView" />
4.3.4. 레이아웃 전개
C04_inflation3.xml
public class C04_Inflation4 extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linear = new Lin-
earLayout(this);
linear.setOrientation(LinearLayout.VERTICAL);
linear.setBackgroundColor(Color.LTGRAY);
TextView text = (TextView)View.inflate(this, R.lay-out.c04_mytext, null);
linear.addView(text); setContentView(linear);}
}
19
4.3.6. 레이아웃 파라미터 변경
• ViewGroup.LayoutParams getLayoutParams ()• void setLayoutParams (ViewGroup.LayoutParams params)
뷰의 속성 변경
C04_setparameter.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"android:layout_height="fill_parent">
<Buttonandroid:id="@+id/btnleft" android:layout_width="0px" android:layout_weight="1" android:layout_height="wrap_content" android:text="Left"/>
<Buttonandroid:id="@+id/btnright" android:layout_width="0px" android:layout_weight="1" android:layout_height="wrap_content" android:text="Right"/>
</LinearLayout>
20
4.3.6. 레이아웃 파라미터 변경
C04_setparameter.java
public class C04_SetParameter extends Activity {
Button mLeft;Button mRight;public void onCreate(Bundle savedInstanceS-
tate) {super.onCreate(savedInstanceState);
setContentView(R.layout.c04_setparameter);
mLeft = (Button)findViewById(R.id.btnleft); mRight =
(Button)findViewById(R.id.btnright);
mLeft.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {setParam(3, 1);
}});
mRight.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {setParam(1, 3);
}});
}
C04_setparameter.java
void setParam(int left, int right) {LinearLayout.LayoutParams lparam =
(LinearLayout.LayoutParams)mLeft.getLayoutParams();
lparam.weight = left;mLeft.setLayoutParams(lparam);
LinearLayout.LayoutParams rparam =
(LinearLayout.LayoutParams)mRight.getLayoutParams();
rparam.weight = right;mRight.setLayoutParams(rparam);
}}