상세 컨텐츠

본문 제목

WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 해결하기

안드로이드/코틀린, 자바

by 개발익선 2021. 1. 15. 17:00

본문

요즘 정말 자주 접하는 에러이다.

BadTokenException..

여기저기서 빵빵 터져주는 에러다.. (내 기초가 얕아도 많이 얕나 보다...)

 

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?

 

- 액티비티에서 다이얼로그를 띄우려다가 에러가 났다.

 

에러 내용을 살펴보면 '창을 띄울 수 없다.'

'토큰 null이 유효하지 않다. 너 액티비티가 실행 중이냐?'

ㅋㅋㅋㅋㅋㅋㅋ 오잉.. 난 메인 액티비티에서 띄운 것인데;;

 

아하.. 검색 좀 해보니 이놈이 문제였다.

Context와 다이얼로그에 대해 이해를 잘해야 앞으로 모두 이 에러가 안 날 것 같다.

 

자세히 알아보자.

 

쉽게 설명하면 다이얼로그는 액티비티도 아니고 액티비티에 얹어서 띄우기 때문에,

Application의 Context로 하는 것이 아니라 주체가 되는 액티비티(=MainActivity) Context로 해야 하는 것이었다.

이렇게 getApplicationContext()로 다이얼로그에 때려 박아버리니 띄우지 못하고 $BadTokenException을 뱉어낸 것이다.

 

그래서 다이얼로그를 실행하려는 액티비티에서 직접 확인해보니 둘이 성격이 달랐다.

getApplicationContext()는 Application을 나타냈고

this의 context는 현재 다이얼로그를 실행하려는 MainActivity를 가리키고 있었다.

 

해결 방법은 아래와 같이 간단하다.

applicationContextthis로 바꿔주면 된다.

 

1
showActionDialog(applicationContext) -> showActionDialog(this)
cs
1
showActionDialog(getApplicationContext()); -> showActionDialog(this);
cs

 

 

이렇게 하면 이론적으로도 주체 액티비티에서 Action 할 Dialog를 보여주는 것이기에 정상적으로 표시된다!.

이 에러에 대하여 굳이 다이얼로그 에러가 아니더라도, 다른 상황에서 이 이론으로 접근하면 해결이 수월 할 듯하다.

 

 

 

 

포스팅을 읽고,

큰 도움이 되셨다면, 공감(♥)을 던져 주세요!

큰 힘이 되어 다음 포스팅 시에도 파이팅하겠습니다.

관련글 더보기

댓글 영역