본문 바로가기

구글과인터넷/안드로이드

안드로이드 portrait & landscape 처리관련

출처: http://minche.tistory.com/22


안드로이드 폰의 슬라이드가 열리고(landscape),  닫혀서(portrait) 화면이 전환될 때 
필요한 처리를 삽입하는 부분입니다.

아래 코드와 같이 액티비티 코드 내에 onConfigurationChanged() 함수를 오버라이딩하여 사용하면 됩니다.

 
  @Override
  public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig);

      Log.i(LOGTAG, "=== onConfigurationChanged is called !!! ===");
            
   if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { // 슬라이드 닫힐때
    Log.i(LOGTAG, "=== Configuration.ORIENTATION_PORTRAIT !!! ===");    
   } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 슬라이드 열릴때
    Log.i(LOGTAG, "=== Configuration.ORIENTATION_LANDSCAPE !!! ===");   
   }
  }  

//////////////////////////////////////////////////////////////////////////


출처: http://bhnbhn.tistory.com/entry/Android-Portrait-Landscape-Mode-%EC%97%90-%EB%94%B0%EB%A5%B8-Activity-%EC%A0%81%EC%9A%A9


#1. Portrait, Landscape Mode Check

1)
getWindowManager().getDefaultDisplay().getOrientation();

2) 
int screenHeight = getWindow().getWindowManager().getDefaultDisplay().getHeight(); 
int screenWidth = getWindow().getWindowManager().getDefaultDisplay().getWidth(); 
if (screenWidth > screenHeight) {   }

3)
public void onConfigurationChanged (Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        
        if (newConfig.orientation == newConfig.ORIENTATION_PORTRAIT) {
        }  else {
          
        }
}
** onConfigurationChanged() 를 override 하기 위해서는 Activity를 상속받아야 한다.


#2. Portrait, Landscape에 따른 XML을 각각 구성
- res/layout-land
- res/layout-port

/////////////////////////////////////////////////////////////////////



        Resource에서 화면(layout) 정의

·        세로 화면 :/res/layout-port/~.xml

·        가로 화면 :/res/layout-land/~.xml

·        회전 상태 확인

·        Android 2.1

WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);

Display display = wm.getDefaultDisplay();

 

//--- orientation : 0. 세로, 1. 가로

int orientation = display.getOrientation();

·        Android 2.2

WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);

Display display = wm.getDefaultDisplay();

 

//--- Surface.ROTATION_0  : 세로

//--- Surface.ROTATION_90  : 가로

//--- Surface.ROTATION_180 : 세로

//--- Surface.ROTATION_270 : 가로

int rotation = display.getRotation();

·        화면 회전 금지 방법 1

·        AndroidManifest.xml에서 모든 Activity 다음을 추가 한다.

android:screenOrientation="portrait"       //--- 세로 화면 고정

android:screenOrientation="landscape"      //--- 가로화면 고정

·        화면 회전 금지 방법 2

//--- public void onCreate(Bundle savedInstanceState) 함수에서

//--- setContentView(~); 다음에 아래 라인을 추가 한다.


//--- 
세로 화면 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
//--- 
가로 화면 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

·        화면이 회전해도 Activity 다시 로딩되지 않도록 하는 방법

·        Activity 다시 로딩되지 않으므로 화면의 크기는 변하지 않는다따라서 수작업으로 화면을 조정해 주어야 한다.

·        AndroidManifest.xml에서 모든 Activity 다음을 추가 한다.

android:configChanges="keyboardHidden|orientation"

·        모든 Activity 다음을 추가 한다.

@Override

public void onConfigurationChanged(ConfigurationnewConfig) {

   super.onConfigurationChanged(newConfig);

 

   switch(newConfig.orientation) {

        caseConfiguration.ORIENTATION_PORTRAIT:   
            //--- 
수작업으로 세로 화면 생성

            break;

        caseConfiguration.ORIENTATION_LANDSCAPE:  
            //--- 
수작업으로 가로 화면 생성

            break;

    }

}

·        화면 회전시 정보를 저장한  복구하는 방법

·        public void onCreate(Bundle savedInstanceState) 복구와 관련된 코딩을 한다.

Object obj = getLastNonConfigurationInstance()

if (obj != null) {

   HashMap<String, Object> map = (HashMap<String, Object>) obj;

    //--- 저장된 복구 데이터로 화면 또는 Thread를 복구 한다.

}

·        public void onDestroy() 화면 종료와 관련된 코딩을 한다.

public void onDestroy() {

   if(isFinishing()) {

       //--- 화면이 종료될 때, Thread 처리 등을 한다.

       //---  worker.interrupt();

        //---   worker = null;

    } else {

               //--- 화면이회전할 때

    }

   super.onDestroy();

}

·        public Object onRetainNonConfigurationInstance() 화면 회전시 데이터를 저장하는 코딩을 한다.

public Object onRetainNonConfigurationInstance() {

   HashMap<String, Object> map = null;

 

    map = newHashMap<String, Object>();

    //--- 화면 또는 Thread에서 복구할 데이터를 저장 한다.

    return map;

}

·        참고 문헌

·        안드로이드 UI 디자인 패턴, 2010.5.19 by Google

·        Icon Design Guidelines, Android 2.0

·        Supporting MultipleScreens, 2010.5

·        화면 회전을 빠르게 처리하기 (Faster Screen Orientation Change),2010.6


*** 참고 문헌 ***

·        오픈소스 비즈니스 컨설팅 - Android

·        오픈소스 비즈니스 컨설팅 - Android SDK