일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- github submodule
- 코틀린
- 2d게임
- 유니티
- 쿼터뷰
- DataBinding
- Android Studio
- 타이쿤
- firebase
- submodule pull
- github
- 게임개발
- java
- Unity
- 내 맘대로 정리한 안드로이드
- 서브모듈 pull
- gitlab submodule
- 안드로이이드 submodule
- submodule sourcetree
- 개발
- 앱
- 앱개발
- Kotlin
- 안드로이드
- 카페오냥
- GIT
- 서브모듈 sourcetree
- Android
- 안드로이드개발
- 티스토리
- Today
- Total
Uing? Uing!!
[안드로이드 팁] configChanges : 화면이 회전해도 상태는 유지하고 싶어요! 본문
configChanges
앞서 액티비티 생명주기 (Activity Lifecycle)에 대한 포스팅을 했었다.
위 글에서 화면이 회전해 가로/세로모드가 변경될 때에는 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)일 경우에는 리니어 레이아웃을 선택하는 방식으로 화면 구성을 변경하였다.
'Android' 카테고리의 다른 글
[안드로이드 삽질기록] Firebase FCM - MismatchSenderId 에러 : 서버키(Server Key) 받아오기 (1) | 2020.08.04 |
---|---|
[내 맘대로 정리한 안드로이드] 스플래시(Splash) 화면은 어떻게 만들어야 효율적으로 활용할 수 있을까? (4) | 2020.08.03 |
[내 맘대로 정리한 안드로이드] 액티비티 생명주기 (Activity Lifecycle) (0) | 2020.07.31 |
[내 맘대로 정리한 안드로이드] 왜 UI Thread에서는 긴 작업을 하면 안 되는 걸까? (0) | 2020.07.30 |
[내 맘대로 정리한 안드로이드] Java와 Kotlin에서의 접근 제한자 (0) | 2020.07.29 |