일반적으로 최신의 WAS에서는 UTF-8을 기본으로 제공한다. 대부분의 다국어 처리를 위해서는 UTF-8을 권장하고 있으나 부득이한 경우 다른 문자셋을 사용할 필요가 있다. 이럴 때 사용자 request의 paramter가 WAS에서 깨지는 현상이 발생하므로 아래와 같이 CharacterEncodingFilter를 설정한다.
${WarDirectory}/WEB-INF/web.xml에 다음과 같이 filter를 설정한다.
아래 xml에서 적용한 Filter는 SpringFramework에서 제공하는 필터이다. 기타 jboss, tomcat 등에서 제공하는 필터도 동일하게 적용할 수 있다.
GUI 프로그래밍을 학습할 때, UI컴포넌트 배치 및 이벤트 헨들링은 반드시 거처가야할 과정이다. Android 역시 GUI를 가진 응용프로그램이므로 컴포넌트 레이아웃 및 이벤트 헨들링에 대한 기본 지식을 알아야 할 것이다.
II. 본론
안드로이드 개발을 위한 컴포넌트 배치, 이벤트 헨들러 적용을 순서로 진행한다.
1) UI컴포넌트 배치
EditText와 Button을 위에서 아래 방향으로 배치한 Activity를 구현한다. 목표 하는 어플리케이션의 UI는 아래와 같다.
먼저 안드로이드 프로젝트를 생성한다. 프로젝트 명과 패키지명을 com.jjis.test.event로 입력하고 Activity명과 Application명을 TestEventHandler로 입력한다.
Finish버튼을 클릭하면 기본 프로젝트 프레임이 생성되는데... 여기에서 어플리케이션 실행시 처음 표시되는 Activity인 com.jjis.test.event를 열어본다.
TestEventHandler의 생성시 CallBack되는 onCreate 메서드의 내용에서 setContentView메서드를 이용하여 R.layout.main을 ContentView로 설정한다. 따라서 TestEventHandler 엑티비티가 화면에 표시하는 내용은 <PROJECT>/res/layout/main.xml 에 의해서 결정된다. 결국 <PROJECT>/res/layout/main.xml 을 수정하면 화면이 변경된다는 말이다. (헉헉..똑같은 말을 몇번하는건지... 이런 걸 두고 짬뽕 100 그릇 이라고 하던가?)
이렇게 main.xml만 수정하고 Project를 실행시켜 본다.
유후~!! 목표하던 그림이 나왔다.. 나만 기쁜가?
그림 나왔다고 그냥 만족하고 넘어가면 안된다. 왜 EditText와 Button이 한줄에 하나씩 세로 방향으로 배치되었을까? 여기서 알고 넘어가야 할 것이 있다. 그것은 바로 Layout이다.
Layout
main.xml을 보면 EditText와 Button을 감싸고 있는 LinearLayout가 있다. Layout라는 말에서 컴포넌트 배치 규칙을 의미하는 컴포넌트(?)인 것을 알 수 있다.
Layout 의 종류를 확인해 보자.
FrameLayout : 레이아웃 관리자 중에서 가장 간단한 형태이다. FrameLayout은 단순히 하위 View를 좌상 코너에 붙여 버린다. 하위 뷰가 멀티인 경우, 무조건 좌상에 붙어 버리므로 , 이전 컴포넌트를 덮어버리는 형식으로 추가된다. 이걸 어디다 쓰라고 만든건지..쩝.
LinearLayout : LinearLayout은 각 하위 View를 수직 또는 수평으로 직선상에 배치한다. 수직 레이아웃은 하위 View를 추가할 때마다 한개의 행에 한개씩만 배치된다. LinearLayout에서는 하위 View에 대해서 weight 속성을 부여할 수 있다. 이 속성은 View의 상대적인 크기를 결정하게 된다.
RelativeLayout : RelativeLayout 를 사용하면 각 스크린 경계에 대하여 View의 상대 위치를 지정할 수 있게 된다.
TableLayout: View를 행과 열방식의 그리드로 배치할 수 있게 한다. 여러개의 행 이나 열을 합할수도 있고 열의 크기를 줄이거나 늘일수도 있다.
<PROJECT>/src/com.jjis.test/R.java 파일에 id와 관련된 속성이 inline class로 생성되었음을 알 수 있다.
그렇다면 생성된 ID를 이용해서 MapView 객체의 레퍼런스를 가져 오도록 findById 메서드를 이용해 보자. 아래와 같이 맴버 변수로 MapView 를 하나 선언하고 onCreate 메서드에 fiewViewById를 호출해서 mapView 변수에 할당하자. 여기서 View를 찾기위한 ID는 R.java의 R.id.testMapView를 이용할 수 있다.
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); mapView = (MapView)findViewById(R.id.testMapView);
}
몇가지 import를 해야 하지만.. eclipse의 shift+alt+O를 사용해서 처리하기 바란다.. 다시 실행해 보면 아래와 같이 10,10의 위치에 Zoom Controller가 나타난다. 이 화면은 Zoom Controller와 마우스 드래그를 통해서 서울로 이동한 화면이다.
원하는 장소로 이동하여 보여주기
안드로이드 어플리케이션에서 사용자의 조작이 아닌 경우에 위치 이동을 해야 할 경우가 있을것이다. 아래의 코드와 같이 MapActivity의 onCreate 메소를 수정한다.
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView)findViewById(R.id.testMapView);
mapView.setSatellite(true);
<uses-library android:name="com.google.android.maps" /> 는 com.google.android.maps api를 사용하겠다는 선언인것 같다.
그리고 <uses-permission android:name="android.permission.INTERNET" />은
개인적으로 애먹은 부분인데.. 이 어플리케이션이 사용할 수 있는 리소스에 대한 권한을 설정해 주는 부분이다. MapView는
Google Maps서비스를 인터넷을 통해 사용하고 있으므로 INTERNET 퍼미션을 제공하여야 한다.
mapview.xml 생성하기
com.test.mapview프로젝트에서 res/layout 디렉토리에 mapview.xml 을 생성한다.
여기서 android:apiKey 는 링크 에 표시된 대로 진행하여 등록하여야 한다. 만약 apikey가 정상적이지 않으면 어플리케이션은 실행되지만 지도가 표시되지 않는다.
여기서 mapview.xml 을 생성하면 builder에 의해서 소스디렉토리의 R.java 파일에 자동으로 Static 변수선언이 등록된다.
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package com.test.mapview;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class id {
public static final int main=0x7f050000;
}
public static final class layout {
public static final int main=0x7f030000; public static final int mapview=0x7f030001;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}
Activity 수정하기
프로젝트 생성시 입력한 Activity(안드로이드에서 View를 담당한다.)의 이름이 MapViewTest였다.
Eclipse의 Package Explorer에서 com.test.mapview.MapViewTest.java 가 생성되어
있음을 확인할 수 있다. 이 파일을 더블클릭하여 오픈한다. 아래와 같이 수정한다. 수정해야 할 부분은 굵은 폰트로 표시하였다.
package com.test.mapview;
import android.os.Bundle;
import com.google.android.maps.MapActivity;
public class MapViewTest extends MapActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapview);
}