달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
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