Uing? Uing!!

[안드로이드 팁] configChanges : 화면이 회전해도 상태는 유지하고 싶어요! 본문

Android

[안드로이드 팁] configChanges : 화면이 회전해도 상태는 유지하고 싶어요!

Uing!! 2020. 8. 1. 02:48
반응형

configChanges

앞서 액티비티 생명주기 (Activity Lifecycle)에 대한 포스팅을 했었다.

 

 

[내 맘대로 정리한 안드로이드] 액티비티 생명주기 (Activity Lifecycle)

생명주기(Lifecycle)를 알아야 하는 이유 액티비티 생명주기란 액티비티가 생성되고, 정지되고, 재생되고, 종료되는 등의 상태 변화와 그에 따른 콜백 메서드를 총칭한다. 안드로이드 개발자라면 �

holika.tistory.com

 

위 글에서 화면이 회전해 가로/세로모드가 변경될 때에는 onDestroy() 이후 onCreate()가 다시 시작된다고 했었다.

하지만 화면이 돌아갈 때마다 onCreate()부터 시작해서 모든 값들을 다시 가져올 필요는 없지 않은가.

온라인에서 뭔가를 다운로드 해야 하는 상황을 가정하면 더 그렇다.

회전을 하면 처음부터 다시 다운받는다니. 아 이건 좀.

 

화면을 돌리더라도 지금까지의 상태를 지속하면서 화면 구성만 변경할 수 있다면 좋지 않을까?

Manifest에서 수정할 수 있는 Activity별 configChanges는 그런 편의성을 제공한다.

Activity의 configChanges값에 '변경될 수 있는 설정'들을 지정해주면, 이 설정들이 변경되더라도 액티비티가 재시작되지 않는다.

이렇게 하면, onDestroy() -> onCreate() 대신에 onConfigurationChanged() 메서드가 실행되어 view가 유지된다.

 

설정 방법

AndroidManifest.xml 파일에는 어플리케이션과 관련된 여러가지 정보들이 기록되어 있다.

어플리케이션에 포함된 Activity들에 대한 정보도 여기에 포함되며, <activity>태그 안에 각 액티비티 정보가 제공된다.

이 태그 안에 android:configChanges 값을 설정하면 '변경되더라도 상태를 유지할 설정값'들이 지정된다.

 

이를테면 아래 내용과 같이 지정할 수 있다.

        <activity
            android:name=".MainActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"/>

이 acitivity에는 configChanges로 keyboardHidden, orientation, screenSize의 3가지가 지정되었다.

keyboardHidden은 키보드를 띄우고 다시 숨길 때 설정을 유지하겠다는 뜻이고,

orientation은 화면의 가로모드/세로모드가 전환될 때 설정을 유지하겠다는 뜻이다.

화면이 회전할 때에는 orientation 외에 screenSize 속성도 함께 설정해 주어야 정상적으로 적용된다.

 

이렇게 설정해 준 이후에 액티비티를 실행하고 화면을 전환해 보면 액티비티가 리셋되지 않고 돌아가기만 하는 것을 볼 수 있다.

 

onConfigurationChanged()

configChanges를 설정해 준 값들에 대해서는 onDestroy() -> onCreate() 대신 onConfigurationChanged()가 호출된다.

따라서 만약 화면 전환에 따라 layout을 다르게 바꿔 주고 싶다면 이 메서드를 오버라이딩해서 수정하면 된다.

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        if (resources.configuration.orientation == ORIENTATION_LANDSCAPE) { // landscape
            recycler_view.layoutManager = glManager // grid layout
        } else { // portrait
            recycler_view.layoutManager = llManager // linear layout
        }
    }

예를 들어 위와 같이 onConfigurateionChanged 함수 안에서 orientation 변경 시에 실행할 내용을 설정해 줄 수 있다.

이 코드에서는 resources.configuration.orientation이 가로(ORIENTATION_LANDSCAPE)일 경우에는 그리드 레이아웃을,

세로(ORIENTATION_PORTRAIT)일 경우에는 리니어 레이아웃을 선택하는 방식으로 화면 구성을 변경하였다.

 

반응형
Comments