달력

2

« 2013/2 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 24
  • 25
  • 26
  • 27
  • 28
반응형

'2013/02/14'에 해당되는 글 2

  1. 2013.02.14 안드로이드 - Click Listener 변화
  2. 2013.02.14 안드로이드 - 가로, 세로 모드 전환 처리
728x90
반응형

안드로이드 - Click Listener 변화


Easier click listeners

GUI 개발하는 도중, 여러 Button 에 적합한 Click Listener 를 설정 하는 일이 자주 일어난다. 하지만 이 작업은 좀 상투적인 코드를 요구하곤 한다.


findViewById(R.id.myButton).setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Do stuff
    }
});


이러한 코드의 양을 줄이기 위해, 하나의 Click Listener 만을 생성한 후, 여러개의 Button 들이 해당 Listener 를 공유하게 할 수도 있다. 이러한 방식이 생성되는 클래스의 수를 줄이는데는 도움이 될 수 있지만, 여전히 제법 많은 양의 코드가 필요하고, Click Listener 를 설정하기위하여, XML 레이아웃 상 모든 Button 들에게 ID 를 부여해 주어야 한다.


View.OnClickListener handler = View.OnClickListener() {
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.myButton: // doStuff
                break;
            case R.id.myOtherButton: // doStuff
                break;
        }
    }
}

findViewById(R.id.myButton).setOnClickListener(handler);
findViewById(R.id.myOtherButton).setOnClickListener(handler);


그러나, 안드로이드 1.6에서 더이상 이런 작업을 할 필요가 없다. 개발자는 자신이 작성한 Activity 에 Click 이벤트를 처리하기위한 메서드만을 구현해 주면 된다. (이 메서드는 반드시 하나의 View 를 인자로 받는 형식의 메서드여야 한다.)


class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}


그리고, XML 레이아웃 상에서 앞서 구현한 메서드를 직접 참조해 준다.


<Button android:onClick="myClickHandler" />


이 새로운 방법은 개발자가 작성해야 하는 Java 와 XML 코드의 양 모두를 줄여 주며, 개발자가 어플리케이션 개발에 보다 많은 시간을 사용할 수 있도록 해 준다.


안드로이드 팀은 개발자들이 어플리케이션을 가장 쉽고 효율적으로 작성할 수 있도록 최선을 다하고 있다. 우리는 1.6 에서 이루어진 여러가지 개선 사항들이 유용하길 바라고, 안드로이드 마켓에서 여러분들의 어플리케이션을 만나보길 기대한다.

728x90
반응형
:
Posted by mapagilove
728x90
반응형
원본출처:http://starkapin.tistory.com/184
안드로이드에서 PORTRAIT, LANDSCAPE 두가지 모드로 작업을 진행해야 할 때가 있다. 나는 무조건 단방향모드만 지원할꺼야 라고 기획을 잡아놓으면 이 두가지 상황중 하나만 설정을 해 놓으면 된다. 그러면 조건에 맞춰 어떻게 사용해야 할지를 살펴보자.

Manifest에서 처리하는 것만 조사했으니 이것에 대한 내용만 정리해본다면..


     
           
           
     

위 소스에서 살펴보면 android Attribute 중 screenOrientation이라는 항목이 보인다. 우리는 이것을 설정해 가로모드인지 세로모드인지를 고정시킬 수 있다.

물론 기본적으로 안드로이드에서는 위와 같은 설정을 해주지 않으면 기본적으로 가로, 세로 모드 전환을 시켜준다. 이럴때에는 다음과 같은 상황을 고려해야 한다.

"세로, 가로 모드 전환시 레이아웃은 어떻게 변화시켜 줄 것인가?"

일반적으로 우리가 주로 사용하는 모드는 세로모드다, 가로폭이 좁고 세로폭이 길어 전체적인 웹의 모습이나 리스트 항목을 보기엔 매우 유리한 편이다. 반대로 가로모드는 넓은 화면을 보기에는 좋지만 세로폭이 좁아 아래로 나열된 항목을 볼땐 불편한 점이 많다.

이 두가지를 다 지원한다고 했을 때 각각 아이템 위젯들은 세로형에서 적합한 크기와 가로모드에서 적합한 크기로 변화되어야 한다. 그래서 우리는 이때 다음 명령어를 통해 현재 상태를 읽어 오고 레이아웃을 적용하는 방법을 사용할 수 있다.

WindowManager wm = getWindowManager();
if (wm == null) return;
    setOrientation(wm.getDefaultDisplay().getOrientation()); // 자체 메소드

getOrientation 메소드를 이용하면 우리는 현재 모드를 읽어오게 되고 지금 사용자 정의된 setOrientation 메소드 처럼 자신만의 레이아웃을 관리하는 함수를 등록해 사용 할 수 있다.

if(m_isLandscape == 0) {
    // Portrait mode, Nothing change previous version
    setContentView(R.layout.reservation_setting_layout);
    mMainlayout = (RelativeLayout)this.findViewById(R.id.MainLayout);
}else {
    // Landscape mode, call another layout
    setContentView(R.layout.reservation_date_land_layout);
    mLMainlayout = (LinearLayout)this.findViewById(R.id.MainLayout);
}
setOrientation 메소드 내부를 일부 살펴보자면 위와 같이 가로와 세로모드에서 각각의 레이아웃을 새로 받아온다. 이를 이용해 우리가 원하는 레이아웃을 입맛에 맞게 변경이 가능하다.

문제는 이러한 메소드를 onCreate() 부분에서만 사용하게 만드느냐이다. 답은 '아니다'다. 액티비티 진입시에만 발생하는 onCreate에서만 호출 된다면 액티비티 구동중에서의 변화는 일어나지 않는다. 이럴 때에는 onConfigurationChanged라는 콜백 메소드를 이용하는 방법이 있다. 이를 적용시키기 위해서는 Manifest 파일에서 해당 액티비티에 ConfigChanges 속성을 부여 해준다.

android:configChanges="orientation|keyboardHidden" 

위와 같은 속성을 추가 해준뒤에, 

@Override
public void onConfigurationChanged(Configuration newConfig)
{
	super.onConfigurationChanged(newConfig);
        // 다시 setOrientation()을 호출한다.
        WindowManager wm = getWindowManager();
        if (wm == null) return;
        setOrientation(isLandscape);
}
onConfigurationChanged는 액티비티의 방향전환이 일어날 때 이 메소드를 통해 액티비티를 새로 리셋을 하게된다. 

그외에 핸드폰에서 가로모드 방향전환을 막게 되는 경우가 있는데 이러한 설정을 동일하게 맞춰주기 위한 매니페스트 속성으로는 다음이 존재한다.

android:screenOrientation="unspecified"

위와 같은 내용을 적게 되면 핸드폰 설정값에 따라 방향전환이 일어나게 된다.
728x90
반응형
:
Posted by mapagilove
반응형