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


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)

8
我们应该如何知道而不发布一些代码?
法尔马里(Falmarri)2011年


1
请参阅此答案,该答案链接的主要内容是对该答案的评论中有一段很好的对话,其中描述了为什么会出现此问题以及解决该问题的最佳方法是什么http://stackoverflow.com/a/ 7229248/501483
达拉姆

如果您使用服务,请阅读stackoverflow.com/questions/23516689/…
CoolMind '16

Answers:


421

我猜-您是否尝试使用应用程序上下文创建Dialog?像这样:

new Dialog(getApplicationContext());

错了 您需要使用活动上下文。

您必须尝试:

new Dialog(YourActivity.this);

1
谢谢。但是我没有使用新的Dialog(getApplicationContext()); 我只使用'new AlertDialog.Builder(mContext);' 其中,mContext是活动的引用。
迈克尔

10
然后,mContext应该是MyActivity.this。
路易斯

10
用于创建自定义对话框的android文档(developer.android.com/guide/topics/ui/dialogs.html#CustomDialog)出现此错误。上下文mContext = getApplicationContext(); 对话框对话框=新对话框(mContext); 您的修复导致Dialog dialog = new Dialog(this); 哪个有效!谢谢
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html已修复(已有一段时间)。只是指出这一点以供参考。模式也得到了改善。:)
Martin Marconcini

2
使用getActivity()@SagarDevanga
Pratik Butani 2014年

34

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

并且不要忘记添加权限:

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

是的,这很简单。而且不要忘了添加权限,我刚才进行了编辑。
codezjx

3
无法在RecyclerAdapter中使用getActivity()
Martin Erlic

太棒了:)
Syed Hamza Hassan'Apr

您如何添加标志?
Conner Dassen

13

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

new Dialog(getApplicationContext());

因此,我不得不更改为:

new Dialog(this);

它对我来说很好;)


1
您的答案是正确的,但是仅当您处于活动范围内时,它才有效。如果您在内部范围内,则必须使用MyActivity.class代替,this因为它this引用了另一个对象。
Shahar

1
另外,请this确保您Dialog继承主题。
TheRealChx101

12

尝试getParent()在希望之context类的争论点上new AlertDialog.Builder(getParent());起作用,它对我有用。


为什么要使用getParent()?是什么意思?
何塞·卡斯特罗

2
当您在另一个不扩展Activity类的类中显示任何对话框时,您可能无法获取正在扩展Activity的那个类的上下文。因此,要在试图显示对话框但不扩展Activity的类中获取上下文,可以使用getParent()来返回该上级活动的上下文。
Priyank Joshi

1
感谢@PriyankJoshi,您保存了我的一天,它还解决了“ Android无法添加窗口无效;您的活动正在运行?”这一怪异的例外。
Eslam Yousef Mohammed 2013年

我如何使用getParent()?
vinidog

谢谢!就我而言,它奏效了。我在打电话,this.parent.getActivity().getApplicationContext()但是this.parent.getActivity()做到了。
carlodonz

3

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

 getApplicationContext()
 mContext which is passed by activity.

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

Activity activity=YourActivity.this;

现在,它将很好。

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


2

我尝试在上下文字段中这样做:

this.getActivity().getParent()

对我来说很好 这是从“ Fragment”扩展的类中获得的:

public class filtro extends Fragment{...

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

谢谢 !为了节省我的宝贵时间!(^_^)
不错的umang,

1

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


0

当我尝试使用以下两种情况在Cordova插件下打开“进度对话框”时,出现了此异常:

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

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

后来这样改变了

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

它对我来说很好。


0

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.