尝试打开对话框时出错:android.view.WindowManager$BadTokenException

尝试打开对话框时出错:android.view.WindowManager$BadTokenException,android,dialog,Android,Dialog,我在尝试从Android活动打开对话框时收到此错误。谷歌搜索没有提供任何有用的解释。希望有人知道这个例外意味着什么 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$BadToke

我在尝试从Android活动打开对话框时收到此错误。谷歌搜索没有提供任何有用的解释。希望有人知道这个例外意味着什么

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有一个选项菜单,当我从该菜单中选择一个选项时,它会尝试通过openDialog打开一个对话框。堆栈跟踪似乎表明它在有机会创建对话框之前就崩溃了。任何帮助都将不胜感激

编辑-是的,好吧,一些代码可能非常有用,尽管我认为很明显我的类是从net.sosiouxme开始并接收onoptionItemSelected并调用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,因此正在执行的代码位于该活动的父级中。

Ed Burnett帮助我弄清楚发生了什么。我在这里为其他有类似问题的人记录

结果证明,当我调试通过时,我错了;对话框实际上是被创建的,在显示对话框的过程中我得到了错误。原因是当我创建对话框时,我将getApplicationContext()作为上下文传递给构造函数

dialog = new AlarmEditDialog(getApplicationContext());
相反,我需要传递活动,它本身就是一个上下文

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

显然有一个区别:-)

如果你发布你的代码,可能会有所帮助。你完成了所有这些课程吗?听起来像是一个特定领域的问题。Stackoverflow适用于一般问题和较小的特定问题,但对于系统特定的大型复杂问题,它不是一个好地方。试着把你的问题缩小到更具体的范围,你会从社区中得到更好的回答。大多数都是安卓内置的活动