프로그래밍/안드로이드

안드로이드 onConfigurationChanged 화면 방향 상태 알아보기

가카리 2013. 11. 22. 17:23
반응형

안드로이드 기능에 대해 아주 초보적이고 미흡하지만 하나씩 알아가는게 참 솔솔하다.
어려운 점이 있다면 알고나면 별것 아닌 내용인것들이 하나를 알아가는데 시간이 참 많이 소요된다는 점..ㅋㅋ
어떻게든 책을 보고 서핑해서 알아내서 해결하고 나면 나름 뿌듯한 느낌이 드니 다행이다.
저와 같은 초보 개발자들을 위해 올려 놓는만큼 많은 정보 함께 공유하면 좋겠습니다.

* 필요성
- 가로모드, 세로모드 두가지 화면에 맞는 레이아웃을 제공해야 한다.
- 시나리오상 각 기능에 맞는 화면 인터페이스를 제공하여 어플리케이션 실행할 수 있어야 한다.

* 적용방법
- Manifest.xml 파일에 android.configChanges 속성 추가, 변화항목 지정
- Java 파일 Activity 내부에 onConfigurationChanged() 메소드 구현
  AndroidManifest.xml 에 추가된 속성이 변경시 onConfigurationChanged()  메소드 호출
 
* AndroidManifest.xml 속성 추가

<?xml version="1.0" encoding="utf-8"?>
< manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.androes.realtybook"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
   
        <activity android:name=".Loading"
                  android:label="@string/app_name"
                  android:configChanges="keyboardHidden|orientation">
                  // android:theme="@style/LoadingType"
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>       

    <uses-sdk android:minSdkVersion="7" />
    <uses-permission android:name="android.permission.INTERNET"/>

< /manifest>


* Loading.java onConfigurationChanged 항목 추가

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loading);
       
        Resources r = Resources.getSystem();
        Configuration config = r.getConfiguration();
        onConfigurationChanged(config);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {

      super.onConfigurationChanged(newConfig);
     
      View LoadPage = findViewById(R.id.ID_LAYOUT);
 

         switch(newConfig.orientation){

            case Configuration.ORIENTATION_LANDSCAPE:
                LoadPage.setBackgroundResource(R.drawable.back_imgw);
                Logger.d("Androes", "Loading Start - back_imgw");
            break;

            case Configuration.ORIENTATION_PORTRAIT:
                LoadPage.setBackgroundResource(R.drawable.back_img);
                Logger.d("Androes", "Loading Start - back_img");                      
             break;

         } 
    
    }


* 옵션 설명

android:configChanges 에 선언할 옵션항목은 아래와 같다.

orientation: 스크린이 세로에서 가로로 바뀌는 변경사항.
keyboardHidden: 키보드가 보여지거나 숨겨지는 변경사항 .
fontScale: 사용자가 원하는 폰트의 크기를 변경하는 것.
locale: 사용자가 언어 세팅을 변경하는것.
keyboard: 키보드의 종류가 바뀌는 사항


* 기본방향 설정하기
 - 안드로이드 해당 Activity 에 회전 이벤트를 막을 수 있음
- Manifest.xml 파일 수정
   android:screenOrientation = “portrait” / android:screenOrientation = “landspcape”
- 단, 필요한 Activity 마다 개별 설정이 필요하다.

      // 세로방향 고정
      <activity android:name=".Loading"
                android:label="@string/app_name"
                android:screenOrientation = “portrait”>
...
      </activity>  
      // 가로방향 고정
      <activity android:name=".Loading"
                android:label="@string/app_name"
                android:screenOrientation = “landspcape”>
...
      </activity>

 

 

Activity의 onConfigurationChanged() 메서드 사용시 주의사항 입니다. 보통 onConfigurationChanged() 메서드는 화면전환이 일어날 경우만 호출 된다고 생각하시는 분들이 계실 수 있는데요.! 


실제 onConfigurationChanged() 는 Locale 이나 각종 설정값이 바꼇을 경우 호출 하게 되는 경우가 빈번하게 발생하게 됩니다. 이럴 경우 무조건 onConfigurationChanged() 타기 때문에 혹여 다른 설정값이 바껴서 메서드가 호출 되는 경우를 화면모드가 바꼈다고 생각하시면 안됩니다.


꼭 매개변수로 들어오는 (Configuration newConfig) Configuration을 확인하셔서 작업을 진행해 주시기 바랍니다.!! 그리고 onConfigurationChanged() 로 들어오는 Configuration 들은 모두 Activity를 onCreate() 부터 재시작 시키기 때문에 onConfigurationChanged() 를 오버라이드 하신 후, super.onConfigurationChanged(newConfig) 부분을 잘 설정 하셔서 Activity 재시작을 설정해 주시기 바랍니다.^^

 

 

출처 : http://www.androes.com/42  http://arabiannight.tistory.com/355

반응형