Android '창을 추가 할 수 없음-토큰 널이 애플리케이션 용이 아닙니다'예외


134

대화 상자를 열려고 할 때 다음과 같은 Android 예외가 발생합니다. 누군가 무슨 일이 일어나고 있는지 이해 하고이 문제를 어떻게 해결할 수 있습니까?

android.view.WindowManager$BadTokenException: 
  Unable to add window -- token null is not for an application
    at android.view.ViewRoot.setView(ViewRoot.java:509)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.app.Dialog.show(Dialog.java:241)

8
코드를 게시하지 않고 어떻게 알 수 있습니까?
Falmarri


1
이 답변을 참조하십시오.이 답변의 링크를 게시하는 주요 내용은이 답변에 대한 의견 에이 대화가 왜이 문제가 발생하는지와 그것을 처리하는 가장 좋은 방법이 무엇인지 설명하는 멋진 대화가 있다는 것입니다 . 7229248/501483
dharam

서비스를 사용하는 경우 stackoverflow.com/questions/23516689/…를 읽으십시오 .
CoolMind

답변:


421

추측하고 있습니다-응용 프로그램 컨텍스트로 대화 상자를 만들려고합니까? 이 같은:

new Dialog(getApplicationContext());

이것은 잘못이다. 활동 컨텍스트를 사용해야합니다.

당신은 다음과 같이 시도해야합니다 :

new Dialog(YourActivity.this);

1
감사. 그러나 나는 새로운 Dialog (getApplicationContext ())를 사용하지 않았다. 'new AlertDialog.Builder (mContext);'만 사용합니다. 여기서 mContext는 활동을 나타냅니다.
마이클

10
그런 다음 mContext는 MyActivity.this 여야합니다.
Luis

10
맞춤 대화 상자를 만드는 Android 문서 ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog )에이 오류가 있습니다. 컨텍스트 mContext = getApplicationContext (); 대화 상자 = new Dialog (mContext); 수정하면 Dialog dialog = new Dialog (this); 어느 작품! 감사합니다
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html 이 수정되었습니다. 참고로 이것을 지적하십시오. 패턴도 개선되었습니다. :)
Martin Marconcini

2
getActivity()@SagarDevanga 사용
Pratik Butani

34

을 계속 사용할 수 getApplicationContext()있지만 사용하기 전에이 플래그를 추가해야합니다 dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT). 오류가 표시되지 않습니다.

그리고 권한을 추가하는 것을 잊지 마십시오 :

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

예, 아주 간단합니다. 그리고 권한을 추가하는 것을 잊지 마십시오. 지금 막 편집했습니다.
codezjx 2016 년

3
RecyclerAdapter에서 getActivity ()를 사용할 수 없습니다
마틴 Erlic에게

: 굉장하다 :)
Syed Hamza Hassan

깃발을 어떻게 추가합니까?
코너 Dassen

13

내 경우에는 다음과 같이 대화 상자를 만들려고했습니다.

new Dialog(getApplicationContext());

그래서 나는 다음과 같이 바꿔야했습니다.

new Dialog(this);

그리고 그것은 나를 위해 잘 작동합니다.)


1
답은 정확하지만 활동 범위 내에있을 때만 작동합니다. 내부 범위 에있는 경우 다른 개체를 참조하기 때문에 MyActivity.class대신 사용해야 합니다. thisthis
Shahar

1
또한, this귀하의 확인됩니다 Dialog상속 테마.
TheRealChx101

12

시도 getParent()의 인수 장소에서 context같은 new AlertDialog.Builder(getParent());작동합니다 희망이 나를 위해 일했다.


getParent ()를 사용하는 이유는 무엇입니까?
José Castro

2
Activity 클래스를 확장하지 않는 다른 클래스에 대화 상자를 표시하면 Activity를 확장하는 해당 클래스의 컨텍스트를 얻지 못할 수 있습니다. 따라서 대화 상자를 표시하려고하지만 활동을 확장하지 않는 클래스 내부의 컨텍스트를 얻으려면 getParent ()를 사용하면 해당 상위 활동의 ​​컨텍스트를 반환 할 수 있습니다.
Priyank Joshi 2016 년

1
감사합니다 @PriyankJoshi, 당신은 내 하루를 저장, 그것은 또한 "안드로이드를 추가 할 수 없습니다 활동이 실행 중입니까?"의 이상한 예외를 해결합니다.
Eslam Yousef Mohammed

getParent ()를 어떻게 사용할 수 있습니까?
vinidog

감사합니다! 내 경우에는 효과가있었습니다. 나는 전화 this.parent.getActivity().getApplicationContext()했지만 this.parent.getActivity()트릭을했다.
carlodonz

3

나는 추측하고있다-당신은 대화를 사용하여 만들려고하고있다.

 getApplicationContext()
 mContext which is passed by activity.

비 활동 클래스 대화 상자를 표시하는 경우 활동을 매개 변수로 전달해야합니다.

Activity activity=YourActivity.this;

이제는 잘 작동합니다.

문제가 있으면 알려주세요.


2

나는 문맥 필드에서 이것을 시도했다.

this.getActivity().getParent()

그리고 그것은 나를 위해 잘 작동합니다. 이것은 "Fragment"에서 확장 된 클래스에서 온 것입니다.

public class filtro extends Fragment{...

2

안녕하세요, 당신이 어댑터를 사용하는 경우 기회가있을 수 있습니다.
어댑터, getContext (), 컨텍스트 또는 활동에서 대화 상자를 사용할 때 알아야 할 것은 언젠가 작동하지 않습니다.

여기 v.getRootView().getContext() 에 v가 참조하는 뷰 객체 가있는 트릭 이 있습니다.
예 :


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new DatePickerDialog(v.getRootView().getContext(), date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });  
If you are getting this problem because of alert dialog.
Refer [here][1] But it is same concept.


  [1]: https://stackoverflow.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class

감사합니다 ! 소중한 시간을 구했습니다! (^_^)
Nice umang 2016 년

1

나는 같은 예외가 있습니다. 이 문제를 해결하기 위해 대화 상자의 인스턴스를 매개 변수로 함수에 전달하고 컨텍스트 만 전달하는 대신 getContext ()를 사용하는 대신 사용하십시오. 이 솔루션은 내 문제를 해결하고 도움이되기를 바랍니다.


0

아래 두 가지 경우를 사용하여 Cordova 플러그인에서 진행 대화 상자를 열려고 할 때이 예외가 발생했습니다.

  1. 새로운 ProgressDialog (this.cordova.getActivity (). getParent ());

  2. 새로운 ProgressDialog (this.cordova.getActivity (). getApplicationContext ());

나중에 이렇게 바뀌 었습니다

새로운 ProgressDialog (this.cordova.getActivity ());

그것은 나를 위해 잘 작동합니다.


0

이것을 사용하면 컨텍스트가 작동하지 않습니다 .. 그러나 MyActivityName.이 작동했습니다. 이것이 필요한 사람에게 도움이되기를 바랍니다.


0

AndroidManifest.xml에서 사용자 권한 아래에 추가 하여이 오류를 해결했습니다.

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

또한 활동 이름으로 경고 초기화 대화 상자 :

AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);

자세한 내용을 보려면 방문 ==> Android에서 경고 대화 상자를 만드는 방법

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.