Android 1.6 : “android.view.WindowManager $ BadTokenException : 창을 추가 할 수 없습니다. 토큰 null은 응용 프로그램 용이 아닙니다” add window

대화 상자 창을 열려고하는데 열 때 마다이 예외가 발생합니다.

Uncaught handler: thread main exiting due to uncaught exception
android.view.WindowManager$BadTokenException:
     Unable to add window -- token null is not for an application
  at android.view.ViewRoot.setView(ViewRoot.java:460)
  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
  at android.app.Dialog.show(Dialog.java:238)
  at android.app.Activity.showDialog(Activity.java:2413)

showDialog디스플레이의 ID 로 호출 하여 만들고 있습니다 . onCreateDialog핸들러는 벌금을 기록하고 나는 문제없이 단계별로 할 수 있지만, 내가 뭔가를 누락 것처럼 보이기 때문에 나는 그것을 첨부했습니다 :

@Override
public Dialog onCreateDialog(int id)
{
    Dialog dialog;
    Context appContext = this.getApplicationContext();
    switch(id)
    {
        case RENAME_DIALOG_ID:
            Log.i("Edit", "Creating rename dialog...");
            dialog = new Dialog(appContext);
            dialog.setContentView(R.layout.rename);
            dialog.setTitle("Rename " + noteName);
            break;
        default:
            dialog = null;
            break;
    }
    return dialog;
}

이것에서 빠진 것이 있습니까? 에서 대화 상자를 만들 때이 문제가 발생하는 것에 대해 몇 가지 질문에 대해 이야기 onCreate했습니다. 활동이 아직 생성되지 않았기 때문에 발생하지만 메뉴 객체에서 호출 한 appContext것이므로 변수가 디버거에 올바르게 채워진 것처럼 보입니다.



답변

대신 :
Context appContext = this.getApplicationContext();
현재 활동에 대한 포인터를 사용해야합니다 (아마도 this).

오늘도 이것에 물 렸습니다. 성가신 부분은 getApplicationContext()developer.android.com의 축약어입니다.


답변

활동이 아닌 컨텍스트를 통해 애플리케이션 창 / 대화 상자를 표시 할 수 없습니다. 유효한 활동 참조를 전달하십시오


답변

getApplicationContext에 대한 내용입니다.

안드로이드 사이트의 문서가 그것을 사용한다고 말했지만 작동하지 않습니다 … grrrrr 😛

그냥 해:

dialog = new Dialog(this); 

“this” 는 일반적으로 대화를 시작하는 활동입니다.


답변

안드로이드 문서는 getApplicationContext ();

AlertDialog.Builder 또는 AlertDialog 또는 Dialog를 인스턴스화하는 동안 현재 활동을 사용하는 대신 작동하지 않습니다 …

전의:

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

또는

AlertDialog.Builder builder = new  AlertDialog.Builder((Your Activity).this);


답변

대신에 getApplicationContext(), 단지 사용ActivityName.this


답변

비슷한 클래스가 있는데 다른 클래스가 있습니다.

public class Something {
  MyActivity myActivity;

  public Something(MyActivity myActivity) {
    this.myActivity=myActivity;
  }

  public void someMethod() {
   .
   .
   AlertDialog.Builder builder = new AlertDialog.Builder(myActivity);
   .
   AlertDialog alert = builder.create();
   alert.show();
  }
}

대부분 잘 작동했지만 때로는 같은 오류로 충돌했습니다. 그런 다음에 나는 MyActivity

public class MyActivity extends Activity {
  public static Something something;

  public void someMethod() {
    if (something==null) {
      something=new Something(this);
    }
  }
}

객체를로 유지했기 때문에 static코드의 두 번째 실행은 여전히 ​​원래 버전의 객체를 유지하고 있었으므로 여전히 원본을 참조했습니다.Activity 더 이상 존재하지 않는 있었습니다.

어리석은 어리석은 실수, 특히 내가 static처음부터 물건을 들고있을 필요가 없었기 때문에 …


답변

그냥 바꿔

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

대신에

AlertDialog.Builder alert_Categoryitem =
    new AlertDialog.Builder(getApplicationContext());