尝试从我的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,因此正在执行的代码位于活动的父级中.
埃德伯内特帮助我弄清楚发生了什么.我把它记录在这里给其他有类似问题的人.
当我调试通过时,我错了; 实际上正在创建对话框,并且在显示对话框期间我收到了错误.原因是当我创建对话框时,我将getApplicationContext()作为Context传递给构造函数.
dialog = new AlarmEditDialog(getApplicationContext());
相反,我需要传递活动,这本身就是一个上下文.
dialog = new AlarmEditDialog(this); // the Activity
显然有区别:-)
| 归档时间: | 
 | 
| 查看次数: | 2167 次 | 
| 最近记录: |