Android 1.6: «android.view.WindowManager $ BadTokenException: невозможно добавить окно - нулевой токен не для приложения» - PullRequest
300 голосов
/ 14 апреля 2010

Я пытаюсь открыть диалоговое окно, но каждый раз, когда я пытаюсь открыть его, выдается следующее исключение:

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 с идентификатором дисплея. Обработчик 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 выглядит так правильно заполнен в отладчике.

Ответы [ 16 ]

609 голосов
/ 14 апреля 2010

вместо: Context appContext = this.getApplicationContext(); Вы должны использовать указатель на занятие, в котором вы находитесь (вероятно, this).

Сегодня меня это тоже укусило, досадная часть - это getApplicationContext() дословно от developer.android.com: (

78 голосов
/ 14 апреля 2010

Вы не можете отобразить окно / диалог приложения через Контекст, который не является Деятельностью. Попробуйте передать действительную ссылку на активность

45 голосов
/ 08 мая 2010

То же самое с getApplicationContext.

В документах на сайте Android сказано использовать его, но он не работает ... grrrrr: -P

Просто сделай:

dialog = new Dialog(this); 

"this" - это обычно ваша активность, с которой вы начинаете диалог.

43 голосов
/ 08 февраля 2012

Документы Android предлагают использовать getApplicationContext ();

но он не будет работать вместо того, чтобы использовать текущую активность при создании экземпляра AlertDialog.Builder или AlertDialog или Dialog ...

Пример:

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

или

AlertDialog.Builder builder = new  AlertDialog.Builder((Your Activity).this);
17 голосов
/ 23 апреля 2015

Вместо getApplicationContext(), просто используйте ActivityName.this

13 голосов
/ 03 августа 2011

У меня была похожая проблема, когда у меня был другой класс, примерно такой:

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 во-первых ...

12 голосов
/ 08 мая 2013

Просто измените его на

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

Вместо

AlertDialog.Builder alert_Categoryitem = 
    new AlertDialog.Builder(getApplicationContext());
9 голосов
/ 13 июля 2015

Другим решением является установка типа окна для системного диалога:

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

Для этого требуется разрешение SYSTEM_ALERT_WINDOW:

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

в документах сказано:

Очень немногие приложения должны использовать это разрешение;эти окна предназначены для взаимодействия с пользователем на уровне системы.

Это решение следует использовать, только если вам требуется диалоговое окно, не привязанное к действию.

4 голосов
/ 04 марта 2015

Не используйте getApplicationContext() при объявлении набора

Всегда используйте this или ваш activity.this

3 голосов
/ 06 декабря 2015

Это сработало для меня -

new AlertDialog.Builder(MainActivity.this)
        .setMessage(Html.fromHtml("<b><i><u>Spread Knowledge Unto The Last</u></i></b>"))
        .setCancelable(false)
        .setPositiveButton("Dismiss",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                    }
                }).show();

Использование

ActivityName.this
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...