Android“无法添加窗口——令牌 null 不适用于应用程序”异常

当我试图打开一个对话框时,我得到了下面的 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)
142191 次浏览

我猜——你是想用应用程序上下文创建 Dialog 吗:

new Dialog(getApplicationContext());

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

你得试试这样:

new Dialog(YourActivity.this);

尝试 getParent()context的参数位置像 new AlertDialog.Builder(getParent());希望它会工作,它为我工作。

在我的例子中,我试图创建这样的对话框:

new Dialog(getApplicationContext());

所以我不得不改变:

new Dialog(this);

这对我来说很好;)

我在上下文字段中尝试过:

this.getActivity().getParent()

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

public class filtro extends Fragment{...

我猜,你是想用。

 getApplicationContext()
mContext which is passed by activity.

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

Activity activity=YourActivity.this;

现在,它将是伟大的工作。

如果你发现任何麻烦,告诉我。

您可以继续使用 getApplicationContext(),但是在使用之前,您应该添加这个标志: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT),错误将不会显示。

别忘了加上许可:

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

我得到了这个例外,当我试图打开进度对话框下的 Cordova 插件使用以下两种情况下,

  1. New ProgressDialog (this.cordova.getActivity () . getParent ()) ;

  2. New ProgressDialog (this.cordova.getActivity () . getApplicationContext ()) ;

后来变成这样,

New ProgressDialog (this. cordova.getActivity ()) ;

我觉得挺好的。

使用这个和上下文不适合我. . 但 MyActivityName. 这工作。希望这可以帮助任何人谁需要它。

我得到了相同的异常。我做什么来修复这是传递对话框的实例 作为参数传递到函数中,并使用它而不是仅仅传递上下文,然后使用 getContext ()。这个解决方案解决了我的问题,希望能有所帮助

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

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

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

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

欲知详情,请访问 = = > 如何在 Android 中创建警报对话框

你好,如果你使用适配器有可能是一个机会。
当您在适配器、 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

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

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