Recently in JAVA Category

일반적으로 최신의 WAS에서는 UTF-8을 기본으로 제공한다. 대부분의 다국어 처리를 위해서는 UTF-8을 권장하고 있으나 부득이한 경우 다른 문자셋을 사용할 필요가 있다. 이럴 때 사용자 request의 paramter가 WAS에서 깨지는 현상이 발생하므로 아래와 같이 CharacterEncodingFilter를 설정한다.

${WarDirectory}/WEB-INF/web.xml에 다음과 같이 filter를 설정한다.

아래 xml에서 적용한 Filter는 SpringFramework에서 제공하는 필터이다. 기타 jboss, tomcat 등에서 제공하는 필터도 동일하게 적용할 수 있다.

 

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>EUC-KR</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

개발환경에서 eclipse WTP를 이용하여 jboss에 연동할 수 있다. 이때 기본 port는 8080인데, WTP에서 아무리 변경할려고 하여도 변경되지 않는다.

image

여기서 설정하는 Port는 jboss가 기동/종료 됨을 감지하는 정도의 역할 밖에 하지 않는 것 같다. jboss의 웹 포트를 변경하려면 다음의 설정파일을 수정하여햐 한다.

 

${jboss_installed_directory}/server/default/deploy/jboss-web.deployer/server.xml

 

이 파일에서 Connector의 port를 수정하면 jboss의 웹포트가 변경된다.

<Connector port="9090" address="${jboss.bind.address}"   
     maxThreads="250" maxHttpHeaderSize="8192"
     emptySessionPath="true" protocol="HTTP/1.1"
     enableLookups="false" redirectPort="8443" acceptCount="100"
     connectionTimeout="20000" disableUploadTimeout="true" />


….

<Connector port="9009" address="${jboss.bind.address}" protocol="AJP/1.3"
     emptySessionPath="true" enableLookups="false" redirectPort="8443" />


안드로이드 UI 구현

안드로이드 UI 컴포넌트 레이아웃 및 이벤트 헨들링

작성: zbum

I. 개요

GUI 프로그래밍을 학습할 때, UI컴포넌트 배치 및 이벤트 헨들링은 반드시 거처가야할 과정이다. Android 역시 GUI를 가진 응용프로그램이므로 컴포넌트 레이아웃 및 이벤트 헨들링에 대한 기본 지식을 알아야 할 것이다.

II. 본론

안드로이드 개발을 위한 컴포넌트 배치, 이벤트 헨들러 적용을 순서로 진행한다.

1) UI컴포넌트 배치

EditText와 Button을 위에서 아래 방향으로 배치한 Activity를 구현한다. 목표 하는 어플리케이션의 UI는 아래와 같다.

UI컴포넌트_배치.jpg

먼저 안드로이드 프로젝트를 생성한다. 프로젝트 명과 패키지명을 com.jjis.test.event로 입력하고 Activity명과 Application명을 TestEventHandler로 입력한다.

Finish버튼을 클릭하면 기본 프로젝트 프레임이 생성되는데... 여기에서 어플리케이션 실행시 처음 표시되는 Activity인 com.jjis.test.event를 열어본다.

TestEventHandler.jpg

TestEventHandler의 생성시 CallBack되는 onCreate 메서드의 내용에서 setContentView메서드를 이용하여 R.layout.main을 ContentView로 설정한다. 따라서 TestEventHandler 엑티비티가 화면에 표시하는 내용은 <PROJECT>/res/layout/main.xml 에 의해서 결정된다. 결국 <PROJECT>/res/layout/main.xml 을 수정하면 화면이 변경된다는 말이다. (헉헉..똑같은 말을 몇번하는건지... 이런 걸 두고 짬뽕 100 그릇 이라고 하던가?)

main_xml.jpg

 

이렇게 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를 행과 열방식의 그리드로 배치할 수 있게 한다. 여러개의 행 이나 열을 합할수도 있고 열의 크기를 줄이거나 늘일수도 있다.
  • AbsoluteLayout: 각각의 View를 절대 좌표에 위치시킨다.

 

2) 이벤트 헨들러 

화면을 대충 만들었으니 버튼이 동작하도록 만들어 줘야 한다.

Clear 버튼의 기능은 EditText에 입력된 내용을 초기화(삭제)해 주는 기능이다.

 

먼저 맴버 변수로 두개의 뷰(Button, EditText)를 선언한다.

  1.     private Button clearButton;
        private EditText editText;

 

onCreate안에 뷰의 레퍼런스를 가져와서 맴버 변수에 할당한다.

  1.         editText = (EditText)findViewById(R.id.editText);
            clearButton = (Button)findViewById(R.id.clearButton);

 

clearButton에 setOnClickListener메소드로 이벤트를 달아준다...

  1.         clearButton.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v) {
                    editText.setText("");
                }
            });

 

아래가 전체 소스 코드이다.

스크린샷-Java_-_com.jjis.test.event-src-com-jjis-test-event-TestEventHandler.java_-_Eclipse_Platform_.png

 

이제 결과를 볼 시간이다. 에뮬레이터에서 Clear 버튼을 클릭하면 입력창의 문자열이 사라짐을 확인 할 수 있다.

III. 결론

UI 컴포넌트의 배치 및 이벤트 처리방법을 확인하였다.

 

 

이 글은 스프링노트에서 작성되었습니다.

안드로이드 맵뷰 심화

지난번에 MapActivity 를 통하여 지도 Application을 에뮬레이터에서 실행하였다(안드로이드 MapView API 사용해 보기). 이제 여기에 다양한 기능을 추가해 보겠다.

 

위성 지도 보이기

MapActivity에서 MapView 객체 가져오기

MapActivity 소스코드 내에서 findViewById 메서드를 이용하여 MapView객체의 레퍼런스를 찾아오기 위하여 android:id 속성을 추가한다.

변경할 파일은 <PROJECT>/res/layout/main.xml이다.

  1. <?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"
        >
        <com.google.android.maps.MapView
            android:id="@+id/testMapView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:enabled="true"
            android:clickable="true"
            android:apiKey="03d0eYuU20SMHZARFYNbqBRkKERXqVPMMieAk8g"
            />

    </LinearLayout>

 

<PROJECT>/src/com.jjis.test/R.java 파일에 id와 관련된 속성이 inline class로 생성되었음을 알 수 있다.

그렇다면 생성된 ID를 이용해서 MapView 객체의 레퍼런스를 가져 오도록 findById 메서드를 이용해 보자. 아래와 같이 맴버 변수로 MapView 를 하나 선언하고 onCreate 메서드에 fiewViewById를 호출해서 mapView 변수에 할당하자. 여기서 View를 찾기위한 ID는 R.java의 R.id.testMapView를 이용할 수 있다.

 

  1. package com.jjis.test;

    import android.os.Bundle;

    import com.google.android.maps.MapActivity;
    import com.google.android.maps.MapView;

    public class MapTest extends MapActivity {
       
        private MapView mapView;
       
        /** 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);
        }

        @Override
        protected boolean isRouteDisplayed() {
            // TODO Auto-generated method stub
            return false;
        }

    }

 

MapView의 Satellite 속성 변경

이제 MapActivity에서 지도를 보여주던 MapView의 레퍼런스를 가져 왔으니 단순히 setSatellite 메서드를 이용해서 true속성만 전달해 주면 된다.

  1.     @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            mapView = (MapView)findViewById(R.id.testMapView);
  2.         mapView.setSatellite(true);
        }

 

이제 결과를 확인한다.

 

스크린샷-Android_Emulator_(5554)-1.png

 

유훗... 멋지다.!!

 

MapView에 기능 추가

zoom controller 추가하기

지도가 너무 작다... 자세히 보고 싶은데... zoom controller를 추가해 보자.

MapActivity를 구현한 클래스의 onCreate메서드를 다음과 같이 수정하자..


  1.     @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
       mapView = (MapView)findViewById(R.id.testMapView);
       mapView.setSatellite(true);
      
       int y = 10;
       int x = 10;
      
       MapView.LayoutParams lp;
       lp = new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
               MapView.LayoutParams.WRAP_CONTENT,
               x,y,
               MapView.LayoutParams.TOP_LEFT);
       View zoomControls = mapView.getZoomControls();
       mapView.addView(zoomControls, lp);
       mapView.displayZoomControls(true);

        }

 

 몇가지 import를 해야 하지만.. eclipse의 shift+alt+O를 사용해서 처리하기 바란다.. 다시 실행해 보면 아래와 같이 10,10의 위치에 Zoom Controller가 나타난다. 이 화면은 Zoom Controller와 마우스 드래그를 통해서 서울로 이동한 화면이다.

스크린샷-Android_Emulator_(5554)-2.png

 

원하는 장소로 이동하여 보여주기

안드로이드 어플리케이션에서 사용자의 조작이 아닌 경우에 위치 이동을 해야 할 경우가 있을것이다. 아래의 코드와 같이 MapActivity의 onCreate 메소를 수정한다.

  1.        /** 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);
      
       int y = 30;
       int x = 30;
      
       MapView.LayoutParams lp;
       lp = new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
               MapView.LayoutParams.WRAP_CONTENT,
               x,y,
               MapView.LayoutParams.TOP_LEFT);
       View zoomControls = mapView.getZoomControls();
       mapView.addView(zoomControls, lp);
       mapView.displayZoomControls(true);
     
       //이동하기
       MapController mapController = mapView.getController();
       Double lat = 37.559866*1E6;
       Double lng = 126.98287*1E6;
       GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue());
       mapController.animateTo(point);
       mapController.setZoom(19);

       
        }

 

Professional Android Application Development를 참조하여 개발하고 있다. 여기서는 구글 본사가 표시되도록 경,위도를 입력하였으나.. 약간 안습이지만 우리회사 좌표로 살짝 바꾸었다. 결과는 아래와 같다.

스크린샷-Android_Emulator_(5554)-3(1).png

 

이 글은 스프링노트에서 작성되었습니다.

안드로이드 MapView API 사용에 대해 가이드 형식으로 소개한다.

  • Eclipse IDE를 이용한 Android 환경설정이 완료되었음을 가정한다.

프로젝트 생성하기

이클립스에서 Android 프로젝트를 생성한다.

안드로이드프로젝트.jpg

 

Project name, Package name, Activity name, Application name 을 아래와 같이 입력하고 Finish를 클릭한다.

 안드로이드프로젝트_생성2.jpg

안드로이드의 기본적인 어플리케이션 프레임이 생성되었다.

project_directory.jpg

 

AndroidManifest.xml 수정

 먼저 Application의 기본정보를 포함하고 있는 AndroidManifest.xml을 수정해 보자.

AndroidManifest.xml를 더블클릭하면 다음과 같은 editor가 표시된다.

androidmanifest_수정.jpg

여기서 하단의 AndroidManifest.xml 탭을 선택하고 다음과 같이 수정한다.

 

 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test.mapview"
      android:versionCode="1"
      android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <uses-library android:name="com.google.android.maps" />
        <activity android:name=".MapViewTest"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

 

<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 을 생성한다.

project_directory.jpg

 

생성된 mapview.xml 에 아래와 같이 코드한다.

  1. <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/main"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <com.google.android.maps.MapView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:enabled="true"
            android:clickable="true"
            android:apiKey="Please insert your API_KEY"
            />
    </LinearLayout>

여기서 android:apiKey 는  링크 에 표시된 대로 진행하여 등록하여야 한다. 만약 apikey가 정상적이지 않으면 어플리케이션은 실행되지만 지도가 표시되지 않는다.

 

여기서 mapview.xml 을 생성하면 builder에 의해서 소스디렉토리의 R.java 파일에 자동으로 Static 변수선언이 등록된다.

  1. /* 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 가 생성되어 있음을 확인할 수 있다. 이 파일을 더블클릭하여 오픈한다. 아래와 같이 수정한다. 수정해야 할 부분은 굵은 폰트로 표시하였다.


  1. 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);
        }

        @Override
        protected boolean isRouteDisplayed() {
            // TODO Auto-generated method stub
            return false;
        }

       
    }

 

뮬레이터에서 실행

이제 MapActivity를 이용해서 기본적인 MapView 를 모두 작성하였다. 결과를 확인하기 위하여 에뮬레이터에서 실행해 보자.

실행.jpg

음... 잘 나온다.. 첫작업이라 시행착오가 많았지만 그럭저럭 잘 진행된 것 같다. 다음에는 MapView API를 직접 사용하여 java 코드로 구현해 보아야 겠다.

About This Blog Author

정지범(jibum.jung@gmail.com)

Google AdSense

Clock Link

Developers Works

Creative Commons License
This blog is licensed under a Creative Commons License.