안드로이드 앱 개발기 #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이 발생했던 것입니다.


이슈 해결은 어떻게?

이번 앱에서는 나이트 모드의 디자인이 고려되지 않았습니다. 일정이 짧기 때문에 그것까지는 디자인에서도, 개발에서도 이야기를 할 수 없었던 것입니다. 현재로서는 앱의 나이트 모드를 막는 것이 최선의 해결 방법입니다. 이에 대해서는 다음 포스트에서 계속하겠습니다.


지난 안드로이드 앱 개발기

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.
default.jpg

Coin Marketplace

STEEM 0.20
TRX 0.12
JST 0.029
BTC 61533.72
ETH 3447.25
USDT 1.00
SBD 2.51