WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 해결하기
요즘 정말 자주 접하는 에러이다.
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를 가리키고 있었다.
해결 방법은 아래와 같이 간단하다.
applicationContext 를 this로 바꿔주면 된다.
1
|
showActionDialog(applicationContext) -> showActionDialog(this)
|
cs |
1
|
showActionDialog(getApplicationContext()); -> showActionDialog(this);
|
cs |
이렇게 하면 이론적으로도 주체 액티비티에서 Action 할 Dialog를 보여주는 것이기에 정상적으로 표시된다!.
이 에러에 대하여 굳이 다이얼로그 에러가 아니더라도, 다른 상황에서 이 이론으로 접근하면 해결이 수월 할 듯하다.
포스팅을 읽고,
큰 도움이 되셨다면, 공감(♥)을 던져 주세요!
큰 힘이 되어 다음 포스팅 시에도 파이팅하겠습니다.
안드로이드 웹뷰에서 user-agent 내용 추가하여 분기 처리하기. (0) | 2021.01.28 |
---|---|
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity 해결하기 (0) | 2021.01.15 |
코틀린 Handler deprecated 해결하기 (0) | 2021.01.14 |
안드로이드 크로노미터로 스톱워치(타이머) 쉽게 구현하기 (0) | 2021.01.13 |
안드로이드 리패키지 시 :app:processDebugGoogleServices 에러 (0) | 2020.11.27 |
댓글 영역