Transcript ch07 위젯

위 젯
안드로이드 프로그래밍 정복(Android Programming Complete
Guide)
Contents
 학습목표
 가장 기본적인 위젯인 TextView를 통해 위젯의 일반적인 특징과 프로그래밍
방법을 상세하게 연구해보고 버튼의 사용 방법을 익힌다.
 내용
 리소스
 텍스트 뷰
 버튼
2/45
1. 리소스
 리소스
 프로그램은 코드와 리소스로 구성된다.
 리소스는 동작과 직접적인 상관없이 주로 프로그램의 외형 장식을 정의한다.
 리소스는 환경이나 조건에 따라 통째로 교체할 수 있으므로 장비 호환성 확보에 유리하
며, 언어에 따른 지역화도 간단해진다.
 안드로이드 프로젝트는 현대적인 추세에 따라 코드와 데이터는 철저하게 분리하되 리소
스와 애셋으로 좀 더 세분화 하여 관리하며, 다음은 리소스와 애셋의 데이터면에서 차이
점을 말한다.
• 리소스에 비해 애셋은 동영상 같은 큰 데이터를 의미한다.
• 리소스는 컴파일되지만 애셋은 원본 그대로 저장된다.
• 리소스는 빈번히 사용되는데 비해 애셋은 상대적으로 덜 사용된다.
3/45
1. 리소스
 리소스
 리소스는 형태나 컴파일 방식에 따라 여러 종류로 나뉘며 리소스 타입은 다음과 같다.
폴더
drawable
layout
설명
이미지 파일, 도형을 정의하는 XML 파일 등을 저장한다.
읽기 메서드
getDrawable
화면의 레이아웃을 저장한다. 뷰 그룹과 뷰 파생 클래스의 배치
상태가 레이아웃에 기록된다.
values
문자열, 색상, 배열, 크기, 단순 드로블, 스타일 등 여러 가지 값
들을 정의하는 XML 파일이 이 폴더에 배치된다.
menu
getColor, getText
getString, getDimension
메뉴 구성 파일을 저장한다.
xml
실행중에 읽어서 사용할 임의의 XML 파일을 저장한다.
raw
임의의 이진 파일이 저장된다.
anim
애니메이션 방식을 정의하는 XML 파일을 저장한다.
getXml
openRawResource
4/45
1. 리소스
 리소스 사용
 리소스는 코드에서 다방면으로 활용되어 지며, 모든 메서드에서는 리소스를 인식하는
것은 아니며 리소스 ID를 받아들이지 않는 메서드도 있다.
 리소스를 인식하지 않는 메서드의 예는 대표적인 다음 예와 같다.
• FileInputStream openFileInput (String name)
 다음은 코드에서 리소스 값을 읽어들여 사용하는 예제이다.
Widget/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, Widget!</string>
<string name="app_name">Widget</string>
<string name="textstr">Resource Text</string>
</resources>
 리소스 파일은 XML 포맷이므로 XML 헤더로 시작되며 <resources> 루투 엘리먼트 안
에 개별 리소스들이 엘리먼트로 정의된다.
5/45
1. 리소스
 리소스 사용
 문자열 색상을 리소스로 정의하는 예는 다음과 같다.
Widget/values/colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="textcolor">#0000ff</color>
</resources>
 문자열 크기를 리소스로 정의하는 예는 다음과 같다.
Widget/values/dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="textsize">12pt</dimen>
</resources>
6/45
1. 리소스
 리소스 사용(실습예제)
 코드에서 리소스의 정보를 읽어와 실행중에 속성을 변경해 보자
Widget/layout/readresource.xml
Widget/ReadResource.java
<?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="#e0e0e0"
>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
public class ReadResource extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.readresource);
Resources res = getResources();
TextView text = (TextView)findViewById(R.id.text);
String str = res.getString(R.string.textstr);
text.setText(str);
int textcolor = res.getColor(R.color.textcolor);
text.setTextColor(textcolor);
float textsize = res.getDimension(R.dimen.textsize);
text.setTextSize(textsize);
}
}
7/45
1. 리소스
 리소스 사용
 XML 문서에서 다른 리소스를 참조할 때는 “@[패키지:/]타입/id”표현식으로 사용하되
같은 패키지에 있으면 패키지명은 생략한다.
 리소스 ID를 참조하는 방법이 코드에서와 리소스에서 각각 다르기 때문에 다음과 같이
외워 두자.
8/45
1. 리소스
 스타일과 테마
 스타일과 테마는 여러 가지 속성값의 집합에 대해 이름을 붙여 넣은 것이다.
 스타일과 테마는 속성의 집합이라는 면에서 동일하며 정의하는 방법도 같지만 적용 대
상이 다르다.
• 스타일 : 각각의 뷰에 개별적으로 적용, 워드 프로세서의 문단 스타일과 개념상 같다.
• 테마 : 액티비티 단위로 적용, 운영체제가 제공하는 데스크톱 테마와 개념상 같다.
 다음 예제를 보고 스타일을 정의해보자 (res/values 폴더에 style.xml파일생성)
Widget/values/styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="red15">
<item name="android:textColor">#ff0000</item>
<item name="android:textSize">15pt</item>
</style>
<style name="yellow15italic" parent="@style/red15">
<item name="android:textColor">#ffff00</item>
<item name="android:textStyle">italic</item>
</style>
</resources>
9/45
1. 리소스
 스타일과 테마(실습예제)
 위젯에 스타일을 적용할 때는 style 속성에 “@style/스타일명”형식으로 지정한다.
Widget/layout/styletest.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="#808080"
Red15스타일
>
텍스트8pt로 수정
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="green"
android:textColor="#00ff00"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="red 15 point"
style="@style/red15"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="yellow 15 point"
style="@style/yellow15italic"
/>
</LinearLayout>
<style name="red15">
<item name="android:textColor">#ff0000</item>
<item name="android:textSize">8pt</item>
</style>
10/45
1. 리소스
 대체 리소스
 안드로이드는 환경에 따라 적절한 리소스를 선택하는 방식이다.
 개발자가 환경별로 사용할 리소스를 따로 작성해 놓으면 시스템은 실행시에 가장 적합
한 리소스를 골라 로드한다.
 환경에 따라 사용할 대체 리소스를 폴더별로 작성하되 폴더의 이름에 환경을 의미하는
접미어를 붙여 놓는다.
환경의 종류
가능한 접미어
언어
ISO 639-1이 정의하는 두 자리 소문자 국가 코드. us, kr, fr, ja, ru 등
지역
소문자 r 다음에 대문자 두 자리로 된 지역 코드. rUS, rKR, rFE 등
화면 방향
해상도
port, land, square
92dpi, 108dpi
터치 스크린
notouch, stylus, finger
키보드 유무
keysexposed, keyshidden
입력 장치
nokeys, qwerty, 12key
네비 방법
nonnav, dpad, trackball, wheel
화면 크기
320x240, 480x320 등. 가로, 세로에 상관 없이 항상 큰 값이 앞에 나온다
11/45
1. 리소스
 대체 리소스(실습예제)
Widget/layout/landport.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:gravity="center"
android:background="#e0e0e0"
>
<Button
android:layout_width="100px"
android:layout_height="wrap_content"
android:text="버튼이다"
/>
<Button
android:layout_width="100px"
android:layout_height="wrap_content"
android:text="수직이다"
/>
</LinearLayout>
Widget/src/Landport.java
public class LandPort extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.landport);
}
}
12/45
1. 리소스
 대체 리소스(실습예제)
Widget/layout-land/landport.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:background="#e0e0e0"
>
<Button
android:layout_width="100px"
android:layout_height="wrap_content"
android:text="누르세요"
/>
<Button
android:layout_width="100px"
android:layout_height="wrap_content"
android:text="수평이다"
/>
</LinearLayout>
13/45
2. 텍스트 뷰
 기본 속성
 위젯 중 가장 사용되는 것은 명령을 입력 받는 Button과 문자열을 입력받는 Edit Text
이다.
 클래스 계층도를 보면 이 둘은 TextView로부터 상속을 받으며 View도 상속받는다.
14/45
2. 텍스트 뷰
 기본 속성(예제)
15/45
2. 텍스트 뷰
 기본 속성
 수평 입력
• 위젯의 폭보다 더 긴 문자열이 입력될 때의 동작을 지정한다.
• 디폴트는 자동 개행이어서 여러 줄을 입력할 수 있다.
 입력 문자 제한
• 키패드에 있는 모든 문자를 입력할 수 있다.
• digits 속성에 문자열을 지정해 놓으면 문자열 내에 있는 문자들만 입력이 가능하다.
numeric 속성값
설 명
integer
아라비아 숫자만 입력 받는다.
signed
선두에 – 부호를 허용한다. 숫자 중간에는 올 수 없다.
decimal
소수점을 허용한다. 소수점은 반드시 하나만 와야 한다.
16/45
2. 텍스트 뷰
 기본 속성
 커서 및 포커스
• 에디트는 포커스를 받으면 커서가 문자열의 제일 끝으로 이동한다.
 자동 링크
• autoLink 속성은 문자열에 포함된 링크를 자동으로 해석하여 링크로 표시하고 클릭 이벤트를 처
리하여 링크로 점프한다.
• 지원 가능한 링크는 다음과 같으며 연산자로 묶어 여러 가지 링크를 같이 지정할 수 있다.
링크
설 명
링크
설 명
none
링크를 지원하지 않는다.
web
웹 주소를 인식한다.
email
이메일 주소를 인식한다.
phone
전화번호를 인식한다.
map
지도의 주소를 인식한다.
all
상기의 모든 패턴을 인식한다.
17/45
2. 텍스트 뷰
 기본 속성
 글자의 모양
• shadow★ 속성은 텍스트 밑에 그림자를 깔아 입체적인 장식을 한다.
• Dx, Dy는 그림자와 본 글자의 거리를 말한다.
• Color는 그림자의 색상, Radius는 그림자의 크기이다.
 줄 간격
• 기본 줄 간격은 적용된 폰트의 높이 만큼이며, 줄 간격은 기본 줄 간격의 배수와 여유분으로 지정
하는데 각 lineSpacingMultiplier, lineSpacingExtra 속성으로 지정한다.
18/45
2. 텍스트 뷰
 기본 속성
 글꼴 기준 크기
• 위젯의 크기는 layout_width, layout_height 속성으로 지정하지만 텍스트 뷰는 폰트에 상대적인 크
기로도 지정 할 수 있다.
• lines 속성은 텍스트의 실제 길이에 상관없이 지정한 줄만큼의 높이를 강제로 차지한다.
• ems는 수평 크기를 EM 크기 기준으로 지정한다.
 대소문자 변환
• capitalize 속성을 characters, words, sentences 중 하나로 설정하면 글자, 단어, 문장 단위로 자동
대문자로 변환한다.
19/45
2. 텍스트 뷰
 기본 속성
 생략 부호
• ellipsize 속성은 긴 문자열의 일부 중 어디를 생략할 것인가를 지정한다 .
• marquee는 생략된 부분을 잘라 먹지 않고 긴 내용을 좌우로 스크롤하여 보여준다.
• TextView는 기본적으로 포커스를 가지지 못하므로 focusable 속성을 true로 지정해야 한다.
 힌트
• 힌트는 에디트에 어떤 내용을 입력하라는 안내 문자열이다.
• hint 속성으로 힌트 문자열을 지정하며 textColorHint 속성으로 힌트 색상을 지정한다.
20/45
2. 텍스트 뷰
 buffer Type
 실행중에 코드에서 텍스트 뷰의 문자열을 읽거나 변경할 수 있는데 다음 메서드를 사용
한다.
• CharSequence getText ()
• void setText (int resid [, TextView.BufferType type] )
• void setText (CharSequence text [, TextView.BufferType type])
 CharSequence는 다음 메서들을 제공하는 인터페이스로 정의되어 진다.
메서드
설 명
charAt(int index)
Index번째의 문자를 구한다.
length()
길이를 구한다.
subSequence(int start, int end)
부분 문자열을 추출한다.
toString()
String 타입으로 변환한다.
21/45
2. 텍스트 뷰
 buffer Type
 버퍼타입이란 텍스튜 뷰가 가진 문자열로 어떤 작업을 할 수 있는지를 정의하는 값이다.
 XML문서에서는 bufferType 속성으로 지정한다.
 버퍼타입이 normal이면 단순한 문자열일 뿐이며 실행중에 편집할 수 없다.
 editable이면 실행중에 사용자에 의해 편집이 가능하다.
 중간 수준의 버퍼 타입인 spannable은 편집은 안되지만 문자열의 중간 중간에 표식을 더
삽입 할 수 있다는 뜻이다.
Buffer Type
buffer Type 속성
설 명
NORMAL
normal
단순한 문자열이며 읽기 전용이다.
SPANNABLE
spannable
문자열에 부가 정보를 같이 기록한다.
EDITABLE
editable
편집 가능한 문자열이다.
22/45
2. 텍스트 뷰
 buffer Type(실습예제1)
Widget/spannabletest.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"
>
<EditText
android:id="@+id/edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="-Italic-Red-Under-"
/>
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="SmallBlueBig"
android:textSize="15pt"
android:bufferType="spannable"
/>
<TextView
android:id="@+id/textlink"
android:layout_width="fill_parent”
android:layout_height="wrap_content"
android:text="이름 : 김상형. 프로필 보기. 연락처 수소문하기"
android:bufferType="spannable"
android:textSize="10pt"
android:linksClickable="true"
android:textColorLink="#ffff00"
/>
</LinearLayout>
23/45
2. 텍스트 뷰
 buffer Type(실습예제2)
Widget/SpannableTest
public class SpannableTest extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spannabletest);
EditText Edit = (EditText)findViewById(R.id.edit);
Spannable espan = Edit.getText();
espan.setSpan(new StyleSpan(Typeface.ITALIC), 1, 7,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
espan.setSpan(new BackgroundColorSpan(0xffff0000), 8, 11,
Spannable.SPAN_INCLUSIVE_INCLUSIVE);
espan.setSpan(new UnderlineSpan(), 12, 17,
Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
TextView Text = (TextView)findViewById(R.id.text);
Spannable tspan = (Spannable)Text.getText();
tspan.setSpan(new RelativeSizeSpan(0.5f), 0, 5,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tspan.setSpan(new ForegroundColorSpan(0xff0000ff), 5, 9,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tspan.setSpan(new RelativeSizeSpan(1.5f), 9, 12,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView link = (TextView)findViewById(R.id.textlink);
Spannable lspan = (Spannable)link.getText();
URLSpan profile = new URLSpan("") {
public void onClick(View v) {
Toast.makeText(v.getContext(),"이 사람의 프로필을 검색한다.",
0).show();
}
};
lspan.setSpan(profile, 10,
13,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
URLSpan call = new URLSpan("") {
public void onClick(View v) {
Toast.makeText(v.getContext(), "이 사람의 연락처를 찾는다.",
0).show();
}
};
lspan.setSpan(call, 18,
21,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
link.setMovementMethod(LinkMovementMethod.getInstance());
}
}
24/45
2. 텍스트 뷰
 buffer Type
 최상위의 버퍼 타입인 Editable은 스팬을 배치할 수 있음은 물론이고 실행 중에 편집도
가능하다.
 Editable 인터페이스에는 다음 메서드들이 추가로 정의되어 있다.
• Editable insert (int where, CharSequence text)
• Editable delete (int st, int en)
• Editable append (char text)
• void clear ()
• Editable replace (int st, int en, CharSequence text)
 코드에서 메서드를 호출하면 사용자의 직접적인 조작 없이도 문자열을 편집 할 수 있다.
25/45
2. 텍스트 뷰
 buffer Type(실습예제3)
Widget/EditableTest
public class EditableTest extends Activity {
EditText mEdit;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editabletest);
mEdit = (EditText)findViewById(R.id.edit);
((Button)findViewById(R.id.insert)).setOnClickListener(mClickListener);
((Button)findViewById(R.id.delete)).setOnClickListener(mClickListener);
((Button)findViewById(R.id.append)).setOnClickListener(mClickListener);
((Button)findViewById(R.id.replace)).setOnClickListener(mClickListener);
((Button)findViewById(R.id.clear)).setOnClickListener(mClickListener);
}
case R.id.append:
edit.append("APP");
break;
case R.id.replace:
edit.replace(2, 5, "REP");
break;
case R.id.clear:
edit.clear();
break;
}
}
};
}
Button.OnClickListener mClickListener = new Button.OnClickListener() {
public void onClick(View v) {
Editable edit = mEdit.getText();
switch (v.getId()) {
case R.id.insert:
edit.insert(0, "INS");
break;
case R.id.delete:
edit.delete(2, 5);
break;
26/45
2. 텍스트 뷰
 문자열 변경 리스너
 에디트는 편집 관련 기능들이 모두 활성화되어 있어 레이아웃에 배치해 놓기만 해도
즉시 편집이 가능하다.
 텍스트가 변경되는 시점에 특정 작업을 하고 싶다면 다음 메스드로 리스너를 등록 한다.
• void addTextChangedListener (TextWatcher watcher)
 편집 이벤트를 처리하는 TextWatcher 객체를 생성한 후 리스너로 등록해 놓으면 사용자
가 문자열을 편집할 때마다 TextWatcher 인터페이스의 다음 메서드가 호출된다.
• void beforeTextChanged (CharSequence s, int start, int count, int after)
• void afterTextChanged (Editable s)
• void onTextChanged (CharSequence s, int start, int before, int count)
27/45
2. 텍스트 뷰
 문자열 변경 리스너
Widget/TextChage
public class TextChange extends Activity {
EditText mEdit;
TextView mText;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.textchange);
mEdit = (EditText)findViewById(R.id.edit);
mText = (TextView)findViewById(R.id.text);
mEdit.addTextChangedListener(mWatcher);
}
TextWatcher mWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s,int start,int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
mText.setText("echo:" + s);
}
};
}
28/45
2. 텍스트 뷰
 문자열 변경 리스너
 에디트의 입력 길이를 제한하는 정석적인 방법은 입력 필터를 사용한다.
• void setFilters (InputFilter[] filters)
 길이 제한 필터는 다음 클래스로 지정하며 생성자의 인수로 제한할 길이를 지정한다.
• InputFilter.LengthFilter (int max)
 다음과 같은 예제의 에디트는 3글자까지만 입력을 허용하는 예이다.
Widget/EditLimit
public class EditLimit extends Activity {
EditText mLimitEdit;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editlimit);
mLimitEdit = (EditText)findViewById(R.id.limit);
mLimitEdit.setFilters(new InputFilter[] {
new InputFilter.LengthFilter(3)
});
}
}
29/45
2. 텍스트 뷰
 커서 및 선택 관리
 에디트는 현재 편집 위치를 표시하기 위해 커서를 표시하며 선택 영역이 있을 때는 선택
블록을 표시한다.
 코드에서 커서의 위치나 선택 블록에 간섭이 필요할 경우 다음 메서드로 선택 영역을 변
경하거나 조사할 수 있다.
• int getSelectionStart()
• int getSelectionEnd()
• void setSelection (int start, int stop)
• void setSelection (int index)
• void selectAll ()
• void extendSelection (int index)
30/45
2. 텍스트 뷰
 커서 및 선택 관리(실습예제)
case R.id.selblock:
mEdit.setSelection(3,10);
break;
case R.id.selall:
mEdit.selectAll();
break;
case R.id.getsel:
int start = mEdit.getSelectionStart();
int end = mEdit.getSelectionEnd();
Toast.makeText(EditSelect.this,
"start = " + start + ",end = " + end,
Toast.LENGTH_LONG).show();
break;
}
}
Widget/EditSelect
public class EditSelect extends Activity {
EditText mEdit;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editselect);
mEdit = (EditText)findViewById(R.id.edit);
((Button)findViewById(R.id.home)).setOnClickListener(mClickListener);
((Button)findViewById(R.id.end)).setOnClickListener(mClickListener);
((Button)findViewById(R.id.selblock)).setOnClickListener(mClickListener);
((Button)findViewById(R.id.selall)).setOnClickListener(mClickListener);
((Button)findViewById(R.id.getsel)).setOnClickListener(mClickListener);
}
};
}
Button.OnClickListener mClickListener = new Button.OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.home:
mEdit.setSelection(0);
break;
case R.id.end:
mEdit.setSelection(mEdit.getText().length());
break;
31/45
2. 텍스트 뷰
 키보드 관리
 에디트의 input Type 속성은 어떤 종류의 값을 입력받을 것인가를 지정하며 이 값에 따
라 키보드에 표시되는 키의 종류가 달라진다.
 input Type은 Class, Variation, Flag 세가지 속성을 연산자로 연결하여 지정한다.
• Class : 숫자, 문자, 비밀 번호 등 입력할 문자의 종류를 지정하며, TYPE_CLASS_* 값들이
여러 개 정의 되어 있다.
• Variation : Class의 세부적인 속성이다.
• Flag : 세부적인 옵션값으로 입력 시 대문자 자동 변환, 여러 줄 입력 등 동작을 지정한다.
32/45
2. 텍스트 뷰
 키보드 관리(예제)
Widget/inputtype.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
android:id="@+id/edit1"
android:layout_width="fill_parent“
android:layout_height="wrap_content"
android:text="Normal"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="number"
android:inputType="number"
/>
==== 이하 생략 ====
33/45
2. 텍스트 뷰
 키보드 관리(실습예제)
Widget/ShowHideKey
public class ShowHideKey extends Activity {
InputMethodManager mImm;
EditText mEdit;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.showhidekey);
mImm =
(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
mEdit = (EditText)findViewById(R.id.edit);
((Button)findViewById(R.id.show)).setOnClickListener(mClickListener);
((Button)findViewById(R.id.hide)).setOnClickListener(mClickListener);
}
Button.OnClickListener mClickListener = new Button.OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.show:
mImm.showSoftInput(mEdit, 0);
break;
case R.id.hide:
mImm.hideSoftInputFromWindow(mEdit.getWindowToken(), 0);
break;
}
}
};
}
34/45
2. 텍스트 뷰
 키보드 관리
 키보드를 화면에 정렬하는 방법에 다음 속성들을 사용하면 변화를 최대한 부드럽게 처
리할 수 있다.
windowSoftlnputMode
adjusPan
설 명
포커스를 받은 뷰가 보이도록 스크롤하여 이동한다. 입력을 받는 뷰는 보이지만
다른 뷰들이 키보드에 가려지는 문제가 있다. 다른 뷰를 보이게 하려면 입력 후
Back키를 눌러 키보드를 닫아야 한다.
adjustResize
윈도우의 크기를 강제로 조정한다. 뷰의 크기가 줄어들기는 하지만 모든 뷰가
다 보 이는 상태이므로 키보드가 열린 채로 다른 뷰를 사용할 수 있다.
시스템이 Pan, Resize 중 하나를 자동으로 선택한다. 시스템은 스크롤이 가능한
adjustUnspecified
뷰인지, 레이아웃에 여백이 얼마나 있는지 등을 고려하여 두 방법 중 하나를 선
택한다.
35/45
2. 텍스트 뷰
 키보드 관리 (예제)
<activity android:name=".AdjustKey1" android:label="AdjustKey1" />
<activity android:name=".AdjustKey2" android:label="AdjustKey2"
android:windowSoftInputMode="adjustResize"
/>
AdjustKey1
AdjustKey2
36/45
3. 버튼
 나인 패치
 Button은 일반적인 푸쉬 버튼을 표현하며 손가락으로 눌러 명령을 내린다.
 버튼은 문자열과 배경으로 구성되어진다.
• 문자열 : 내용, 크기, 색상 등을 선택 할 수 있다.
• 배경 : background 속성으로 지정한다.
 다음 메서드로 코드에서 배경을 변경할 수 있는데 단색, 드로블, 드로블 리소스의 ID를
전달 받는다.
• void setBackgroundColor (int color)
• void setBackgroundDrawable (Drawable d)
• void setBackgroundResource (int resid)
 버튼의 배경으로 사용할 이미지를 drawable 폴더에 넣어두고 background 속성에 지정하
면 이미지가 버튼의 배경에 나타나게 된다.
37/45
3. 버튼
 나인 패치(실습 예제)
Widget/noninepatch.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"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cloud"
/>
<Button
android:layout_width="200px"
android:layout_height="100px"
android:background="@drawable/cloud"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ribbon"
android:textSize="10pt"
android:text="ribbon"
/>
<Button
android:layout_width="250px"
android:layout_height="100px"
android:background="@drawable/ribbon"
android:textSize="10pt"
android:text="ribbon"
/>
</LinearLayout>
38/45
3. 버튼
 나인 패치
 나인 패치는 아홉 조각의 천을 잘라 하나의 무늬를 만드는 이불 제작 기겁의 하나로 디
지털 이미지에서 원리를 응용한 것이다.
 나인 패치 이미지는 PNG 포맷이며 .9.png를 지정하여 일반적인 이미지와 구분한다.
 나인 패치는 이미지의 원래 모양 외에 바깥쪽에 1픽셀 너비의 투명한 영역을 추가로 가
지며, 영역에 검정색 점을 찍어 확장 및 텍스트 배치 영역에 대한 정보를 기록한다.
39/45
3. 버튼
 화살표 버튼
 버튼 위젯을 정의하는 소스는 다음과 같다.
public class Button extends TextView {
public Button(Context context) {
this(context, null);
}
public Button(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.buttonStyle);
}
public Button(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
}
 버튼은 스타일만 다른 텍스트 뷰이며 스타일은 결국 속성의 집합이므로 속성만 다른 텍
스트 뷰이다.
40/45
3. 버튼
 화살표 버튼(실습예제)
Widget/drawable/arrowback.xml
Widget/layout/arrowbutton.xml
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false"
android:state_enabled="true"
android:drawable="@drawable/arrow_normal" />
<item android:state_window_focused="false"
android:state_enabled="false"
android:drawable="@drawable/arrow_disable" />
<item android:state_pressed="true"
android:drawable="@drawable/arrow_press" />
<item android:state_focused="true" android:state_enabled="true"
android:drawable="@drawable/arrow_focus" />
<item android:state_enabled="true"
android:drawable="@drawable/arrow_normal" />
<item android:state_focused="true“
android:drawable="@drawable/arrow_focus" />
<item
android:drawable="@drawable/arrow_normal" />
</selector>
<?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"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/arrowback"
android:text="Arrow Button"
/>
<Button
android:layout_width="150px"
android:layout_height="70px"
android:background="@drawable/arrowback"
android:text="Arrow Button"
/>
<Button
android:layout_width="80px"
android:layout_height="80px"
android:background="@drawable/arrowback"
android:text="Arrow Button"
/>
</LinearLayout>
41/45
3. 버튼
 라디오 버튼
 Button으로부터 파생되는 서브 클래스들.
 CompoundButton은 체크, 언체크의 두 가지 상태를 가지며, 코드에서 체크 상태를 변경
및 조사할 때는 다음 메서드를 사용한다.
• public void setChecked (boolean checked)
• public void toggle ()
• public boolean isChecked ()
42/45
3. 버튼
 라디오 버튼
 체크 상태와 언체크 상태를 관리하는 방법이나 표현방법은 위젯마다 다르다.
 라디오 버튼은 선택 가능한 여러 개의 값 중 하나를 입력 받을 때 사용한다.
 RadioGrouup은 LinearLayout의 서브 클래스이며 라디오 그룹을 일렬로 배치한다.
 그룹내에 속한 라디오 버튼의 체크 상태를 변경할 때는 다음 메서드를 사용한다.
• void check(int id)
• void clearCheck()
• int getCheckedRadioButtonId()
 버튼의 체크 상태가 바뀔 때는 OnCheckedChangeLisener 인터페이스의 메서드가 호출
된다.
• void onCheckedChanged(RadioGroup group, int checkedId)
43/45
3. 버튼
 라디오 버튼(실습예제)
Widget/radiotext.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"
>
<CheckBox
android:id="@+id/BigFont"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Use Big Font"
/>
<RadioGroup
android:id="@+id/ColorGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:checkedButton="@+id/Red"
>
<RadioButton
android:id="@id/Red"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Red"
/>
<RadioButton
android:id="@+id/Green"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Green"
/>
<RadioButton
android:id="@+id/Blue"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Blue"
/>
</RadioGroup>
<ToggleButton
android:id="@+id/MyToggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ff0000"
android:textOn="선택"
android:textOff="안선택"
android:textSize="20px"
/>
</LinearLayout>
44/45
3. 버튼
 이미지 버튼
 ImageButton은 버튼 대용으로 쓸 수 있는 위젯이다.
 표면에 이미지를 표시할 수 있으며 상태에 따라 다른 이미지를 보여주는 것도 가능하다.
 텍스트는 출력할 수 없으며 이미지만 표시할 수 있다.
 Bitmap 객체를 표면에 바로 출력할 수 있는 능력이 있다.
Widget/imagebuttontest.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"
>
<ImageButton
android:id="@+id/imagebtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/cloud"
android:text="이텍스트는 보이지 않음"
/>
</LinearLayout>
45/45
안드로이드 프로그래밍 정복(Android Programming Complete
Guide)