[Android] Android configChanges option (안드로이드 화면 회전시 view 유지방법)

How to maintain view when screen direction change using configChanges option


안드로이드의 경우 화면이 회전되었을 경우 화면을 종료시키고 새로운 layout으로 재 시작한다.

즉 세로화면 -> 가로화면으로 전환 시 onDestroy() 함수가 호출되고 가로모드에서 다시 onCreate() 함수가 호출된다.

즉 환경변화가 일어날 경우 기본적인 동작은 activity 의 재시작이다.

이럴때 AndroidManifest.xml 파일에 ` android:configChanges`을 설정함으로써 activity가 reset되는것을 막을 수 있다.

이런경우 activity의 onDestroy()onCreate() 함수 대신에 onConfigurationChanged()함수가 호출된다.

이러한 옵션이 왜 필요한지 예를 들어보자.

사용자의 이름을 입력하는 Edittext를 1개 포함하는 화면이 있다고 하자.

화면이 처음 구성되는 onCreate()함수에서 사용자의 이름변수를 null로 초기화 하고, 화면이 구성된 이후에 사용자가 이름을 입력하였다.

만약 이때 화면이 가로모드에서 세로모드로 변경되면 화면이 종료되고 다시 시작되기 때문에 사용자의 이름변수는 다시 null이 입력되어 있게 된다.

이런 상황에서 원하는 동작은 사용자가 이름을 입력하였기 때문에 Edittext는 사용자가 입력된 내용을 그대로 유지하고 있어야 한다. 이럴때 configChanges 옵션중에서 orientation 옵션을 주면 화면의 방향이 변경되어도 초기화 되지 않는다.

적용시키는 방법은 다음과 같다.

1. AndroidManifest.xml 수정

AndroidManifest.xml 파일에 android:configChanges="orientation" 을 추가해준다. activity안에 넣어주어야 한다. 다른 설정과 함께 작성하면 다음과 같다.

 <activity
     android:name=".MainActivity"
     android:label="@string/app_name"
     android:windowSoftInputMode="stateAlwaysHidden"
     android:configChanges="orientation"
     android:theme="@style/AppTheme.NoActionBar">
 </activity>

위의 옵션은 화면의 방향이 변해도 화면이 초기화 되지 않도록 하며 (android:configChanges="orientation"), fragment가 변경되었을 때 항상 soft 키보드를 숨기는 옵션 (android:windowSoftInputMode="stateAlwaysHidden") 을 적용하였다. 키보드 관련된 내용은 다음 글을 참고하면 된다.

2. onConfigurationChanged() 함수 작성

1번과 같이 옵션을 추가하고 화면의 방향이 변경 시, onConfigurationChanged() 함수가 호출된다. 만약 화면의 방향이 전환되었을 때 수행해야 하는 작업이 있는 경우 이 함수에 추가하면 된다.

3. configChanges의 여러가지 옵션들

참고사이트: https://aroundck.tistory.com/36

위와 같이 다양한 옵션을 사용할 수 있다. 위의 옵션은 or 구분자(|)를 통해 다음과 같이 중복 입력 가능하다

android:configChanges="orientation|screenLayout"