안드로이드 앱 개발기 #30 - 나이트 모드를 고려하지 않아 메인 화면 시작시 발생한 IllegalStateException
시작하며...
현재 진행 중인 프로젝트가 테스트 단계로 진입했습니다. 그런데 메인 화면이 시작될 때 앱이 죽어버린다는 이슈를 받았습니다. 제가 가지고 있는 폰으로는 재현되지 않았어요. 이에 이슈를 제기한 서버 개발자의 휴대폰으로 같이 테스트를 시도해 보았습니다. 그것으로 문제는 재현되었구요. 당시 발생한 예외는 다음과 같았습니다.
Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
액션바와 툴바
안드로이드 프로젝트를 처음 생성하면 MainActivity가 기본적으로 만들어지구요. 그것이 구성하는 화면에는 기본적으로 액션바가 상단에 위치합니다. 액션바 대신 툴바를 배치할 수 있구요. 이번 프로젝트에서는 전자 대신 후자를 사용하기로 했습니다.
툴바 사용시 테마 변경
화면 상단에 액션바 대신 툴바를 배치하려면, 액티비티의 테마는 액션바가 없는 것을 사용해야 합니다. 가령 values 폴더의 themes.xml 파일에서 테마 스타일을 아래와 같이 적용해야 하는 것이지요.
<style name="Theme.NavigationEx" parent="Theme.MaterialComponents.Light.NoActionBar">
...
</style>
이미 액션바가 있으면, 툴바 적용 불가
액티비티의 테마가 NoActionBar가 아니면, 그것은 액션바를 가지고 있습니다. 여기서 아래 코드와 같이 툴바를 액션바로 설정하면, 앱은 위에 말씀드린 IllegalStateException을 발생시킵니다.
setSupportActionBar(toolbar)
IllegalStateException 발생 원인
그런데 NoActionBar가 values 폴더의 themes.xml 파일에만 적용되었지, values-night 폴더의 themes.xml 파일에는 적용하지 않았습니다. 이슈를 제기한 서버 개발자의 폰에는 나이트 모드가 적용되어 있었고 MainActivity가 위 코드를 실행했기 때문에 이 IllegalStateException이 발생했던 것입니다.
이슈 해결은 어떻게?
이번 앱에서는 나이트 모드의 디자인이 고려되지 않았습니다. 일정이 짧기 때문에 그것까지는 디자인에서도, 개발에서도 이야기를 할 수 없었던 것입니다. 현재로서는 앱의 나이트 모드를 막는 것이 최선의 해결 방법입니다. 이에 대해서는 다음 포스트에서 계속하겠습니다.
지난 안드로이드 앱 개발기
- #29 - 잊고 있었던 앱 재시작 샘플 코드
- #28 - 문자열 리소스 파일 strings.xml 어떻게 작성하면 좋을까?
- #27 - 클린 아키텍처에서 domain 모듈
- #26 - 클린 아키텍처 구현을 위한 모듈 구성
- #25 - 스팀 관련 샘플 코드 만들면서 잘못한 점
- #24 - 시작 화면 구성 요소 식별하기
- #23 - 프로젝트 초기 화면 구성부터 대략적으로...
- #22 - Kotlin 코드로 JavaScript 코드를 실행할 수 있을까?
- #21 - 실습 도중 발생한 오류: A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
- #20 - 클립보드에 텍스트 복사하는 함수 만들어 보기 (Kotlin)
- #19 - 데이터 바인딩 적용했으나 UI 자동 업데이트 되지 않는 문제
- #18 - 에뮬레이터에서 토스트 안 보이는 문제 (1)
- #17 - 유닛 테스트를 실행할 수 없는 문제 해결
- #16 - 잘 되던 유닛 테스트를 실행할 수 없는 문제
- #15 - 앱 재시작 코드
- #14 - Fragment 사용시 간혹 발생할 수 있는 Fragment not attached to Activity 문제
- #13 - Retrofit2 활용 서버로부터 받을 데이터 유형 JsonElement (JSONObject 사용 불가)
- #12 - Glide 활용하여 이미지 다운로드 받는 코드
- #11 - 처리할 수 없는 예외/크래쉬 발생시 앱 재시작하기
- #10 - 안드로이드 스튜디오 업그레이드 후 단축키가 안되면? (맥북)
- #9 - LiveData 객체에 동일 데이터 설정하면 observer 실행되는지 확인 목적의 샘플 프로젝트
- #8 - 안드로이드 스튜디오에서 빌드시 발생하는 Build Tools revision 31.0.0 오류
- #7 - 'UGC(사용자 생성 콘텐츠) 정책 미준수'로 심사 거절
- #6 - 뷰에 역마진 적용 불가시 translationX, translationY 속성 사용하기
- #5 - 프로젝트 생성 후 빌드시 발생 오류: The minCompileSdk (31) specified in a dependency's AAR metadata
- #4 - 프로젝트 생성 후 빌드시 발생 오류: The minCompileSdk (31) specified in a dependency's AAR metadata
- #3 - 무한 롤링 배너 만드는 법을 찾았으나, 높이를 wrap_content로 지정이 안 먹히는 문제점이...
- #2 - setContentView 메소드의 파라메터를 변경하지 않아서 발생한 화면 오류
- #1 - 페이스북 로그인 연동시 발생했던 문제들
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Upvoted! Thank you for supporting witness @jswit.
![default.jpg](https://steemitimages.com/640x0/https://cdn.steemitimages.com/DQmNwBDPMPvL1yaKWTYF4wxyUmxWiEJgAy1WZWTJyCha5wE/jswit_comment_initial.w320.jpg)