134

尝试打开对话框时出现以下 Android 异常。有人可以帮我了解发生了什么,我该如何解决这个问题?

android.view.WindowManager$BadTokenException: 
  Unable to add window -- token null is not for an application
    at android.view.ViewRoot.setView(ViewRoot.java:509)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.app.Dialog.show(Dialog.java:241)
4

12 回答 12

421

我猜-您是否尝试使用应用程序上下文创建对话框?像这样的东西:

new Dialog(getApplicationContext());

这是错误的。您需要使用 Activity 上下文。

你必须尝试像:

new Dialog(YourActivity.this);
于 2011-10-28T18:32:52.067 回答
34

可以继续使用getApplicationContext(),但是在使用前要加上这个flag: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT),就不会报错了。

并且不要忘记添加权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
于 2014-12-25T08:01:07.107 回答
13

就我而言,我试图像这样创建我的对话框:

new Dialog(getApplicationContext());

所以我不得不改变:

new Dialog(this);

它对我来说很好;)

于 2013-04-07T13:49:24.723 回答
12

getParent()在争论的地方尝试context希望new AlertDialog.Builder(getParent());它会起作用,它对我有用。

于 2013-02-01T07:07:37.747 回答
3

我猜-您是否尝试使用创建对话框。

 getApplicationContext()
 mContext which is passed by activity.

如果您显示对话框非活动类,那么您必须将活动作为参数传递。

Activity activity=YourActivity.this;

现在它会很好用。

如果您发现任何问题,请告诉我。

于 2013-05-04T04:34:24.570 回答
2

我在上下文字段中尝试了这个:

this.getActivity().getParent()

它对我来说很好。这是从“片段”扩展而来的一个类:

public class filtro extends Fragment{...
于 2013-05-04T03:32:58.200 回答
2

您好,如果您使用适配器,可能会有机会。
当您在适配器中使用任何对话框时,您需要知道的所有内容、getContext()、上下文或活动有时都不起作用。

这是我使用的技巧 v.getRootView().getContext() ,其中 v 是您正在引用的视图对象。
例如。


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new DatePickerDialog(v.getRootView().getContext(), date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });  
If you are getting this problem because of alert dialog.
Refer [here][1] But it is same concept.


  [1]: https://stackoverflow.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class
于 2019-06-04T07:17:39.213 回答
1

我得到了同样的例外。我解决这个问题的方法是将对话框的实例作为参数传递给函数并使用它而不是只传递上下文然后使用 getContext()。这个解决方案解决了我的问题,希望它可以帮助

于 2018-05-27T00:04:44.660 回答
0

以防万一您试图从片段中显示对话框。只需使用“getActivity()”方法。

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
于 2021-05-07T09:22:15.950 回答
0

当我尝试使用以下两种情况在 Cordova 插件下打开进度对话框时,我遇到了这个异常,

  1. 新的 ProgressDialog(this.cordova.getActivity().getParent());

  2. 新的 ProgressDialog(this.cordova.getActivity().getApplicationContext());

后来改成这样,

新的 ProgressDialog(this.cordova.getActivity());

它对我来说工作正常。

于 2017-08-17T07:02:02.250 回答
0

我通过在 AndroidManifest.xml 中添加以下用户权限解决了这个错误

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

此外,使用活动名称初始化警报对话框:

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

有关更多详细信息,请访问==>如何在 Android 中创建警报对话框

于 2019-03-17T04:57:44.913 回答
0

使用这个和上下文对我不起作用..但是 MyActivityName.this 有效。希望这可以帮助任何需要它的人。

于 2018-03-09T06:35:55.410 回答