Ошибка при попытке открыть диалоговое окно: android.view.WindowManager $ BadTokenException - PullRequest
2 голосов
/ 24 августа 2010

Я получил эту ошибку при попытке открыть диалоговое окно из моей активности Android. Поиск Google не дал никаких полезных толкований. Надеясь, что кто-то имеет представление о том, что вообще означает это исключение?

08-21 00:42:48.515: ERROR/AndroidRuntime(880): Uncaught handler: thread main exiting due to uncaught exception
08-21 00:42:48.595: ERROR/AndroidRuntime(880): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.view.ViewRoot.setView(ViewRoot.java:429)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:178)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.app.Dialog.show(Dialog.java:231)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.app.Activity.showDialog(Activity.java:2407)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at net.sosiouxme.WhenDidI.custom.AlarmEditActivity.openNewAlarmDialog(AlarmEditActivity.java:179)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at net.sosiouxme.WhenDidI.custom.AlarmEditActivity.onOptionsItemSelected(AlarmEditActivity.java:188)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at net.sosiouxme.WhenDidI.activity.TrackerEdit.onOptionsItemSelected(TrackerEdit.java:146)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.app.Activity.onMenuItemSelected(Activity.java:2085)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:820)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:139)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:813)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:519)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.view.View.onTouchEvent(View.java:3828)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.widget.TextView.onTouchEvent(TextView.java:6291)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.view.View.dispatchTouchEvent(View.java:3368)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1691)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1525)
08-21 00:42:48.595: ERROR/AndroidRuntime(880):     at android.os.Handler.dispatchMessage(Handler.java:99)`

Из вышеприведенного может быть полезно знать, что TrackerEdit наследуется от AlarmEditActivity. TrackerEdit имеет OptionsMenu, и когда я выбираю опцию из этого меню, он пытается вызвать диалог через openDialog. Трассировка стека, кажется, указывает на то, что он падает до того, как появится шанс создать диалог. Любая помощь будет оценена.

РЕДАКТИРОВАТЬ - да, хорошо, некоторый код может быть довольно полезным, хотя я подумал, что может быть довольно ясно, что мои классы были частью, которая началась с net.sosiouxme и получила onOptionsItemSelected и называется Activity.showDialog (). Но хорошо, вот эти биты из AlarmEditActivity:

/* ***************************** event handling *************************** */

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.new_alarm:
        openNewAlarmDialog();
        break;
    }
    return super.onOptionsItemSelected(item);
}

/*
 * Open dialog for user to create a new alarm
 */
public void openNewAlarmDialog() {
    Alarm alarm = new Alarm(mTracker.getId());
    alarm.setIvalWeeks(1);
    mAlarmToEdit = alarm;
    mViewOfAlarmToEdit = null;
    showDialog(ALARM_DIALOG); // which is 0
}

Код не делает ничего интересного. Когда пункт меню выбран, он пытается показать диалог. Код никогда не доходил до того момента, когда должен был быть создан диалог, поэтому у меня даже не было возможности испортить это. Единственная вещь, которая отдаленно интересна для этого действия, это то, что реальным действием является TrackerEdit, который расширяет AlarmEditActivity, поэтому выполняемый код находится в родительском объекте действия.

1 Ответ

8 голосов
/ 27 августа 2010

Эд Бернетт помог мне понять, что происходит. Я записываю это здесь для всех, у кого похожая проблема.

Оказывается, когда я отлаживал, я ошибался; диалог фактически создавался, и именно во время показа диалога я получил ошибку. Причина была в том, что когда я создавал диалог, я передавал getApplicationContext () конструктору в качестве Context.

dialog = new AlarmEditDialog(getApplicationContext());

Вместо этого мне нужно было пройти действие, которое само по себе является контекстом.

dialog = new AlarmEditDialog(this); // the Activity

Очевидно, есть разница: -)

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