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

Posted

技术标签:

【中文标题】Android \'无法添加窗口 -- 令牌 null 不适用于应用程序\' 异常【英文标题】:Android 'Unable to add window -- token null is not for an application' exceptionAndroid '无法添加窗口 -- 令牌 null 不适用于应用程序' 异常 【发布时间】:2011-12-17 12:09:18 【问题描述】:

当我尝试打开对话框时出现以下 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)

【问题讨论】:

不贴一些代码我们怎么知道? Android 1.6: "android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application"的可能重复 请参考这个答案,发布这个答案的链接的主要内容是在 cmets 中有关于这个答案的很好的对话,描述了为什么会出现这个问题以及处理它的最佳方法是什么 @987654322 @ 如果您使用服务,请阅读***.com/questions/23516689/…。 【参考方案1】:

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

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

【讨论】:

【参考方案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://***.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class

【讨论】:

谢谢!节省了我宝贵的时间! (^_^)【参考方案3】:

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

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

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

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

欲了解更多详情,请访问==> How to create Alert Dialog in Android

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

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

后来改成这样了,

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

它对我来说很好用。

【讨论】:

【参考方案7】:

你可以继续使用getApplicationContext(),但是在使用之前,你应该加上这个标志:dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT),这样就不会出现错误了。

别忘了添加权限:

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

【讨论】:

是的,很简单。并且不要忘记添加权限,我刚刚编辑了。 不能在 RecyclerAdapter 中使用 getActivity() 太棒了:) 如何添加标志?【参考方案8】:

context 的参数位置尝试getParent(),例如new AlertDialog.Builder(getParent()); 希望它会起作用,它对我有用。

【讨论】:

为什么要使用 getParent()?,什么意思? 当您在另一个未扩展 Activity 类的类中显示任何对话框时,您可能无法获得扩展 Activity 的该类的上下文。因此,要在您尝试显示对话框但不扩展 Activity 的类中获取上下文,您可以使用 getParent() 返回该高级活动的上下文。 感谢@PriyankJoshi,你救了我的命,它还解决了“Android 无法添加窗口无效;您的活动正在运行吗?”的奇怪异常。 我如何使用 getParent() ? 谢谢!它在我的情况下有效。我打电话给this.parent.getActivity().getApplicationContext(),但this.parent.getActivity()成功了。【参考方案9】:

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

new Dialog(getApplicationContext());

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

你必须尝试:

new Dialog(YourActivity.this);

【讨论】:

谢谢。但我没有使用 new Dialog(getApplicationContext());我只使用'new AlertDialog.Builder(mContext);'其中 mContext 是对活动的引用。 那么mContext应该是MyActivity.this。 用于创建自定义对话框的 android 文档 (developer.android.com/guide/topics/ui/dialogs.html#CustomDialog) 出现此错误。上下文 mContext = getApplicationContext();对话框对话框=新对话框(mContext);您的修复导致 Dialog dialog = new Dialog(this);哪个有效!谢谢 developer.android.com/guide/topics/ui/dialogs.html 已修复(不久之后)。只是指出这一点以供参考。图案也得到了改进。 :) 使用getActivity()@SagarDevanga【参考方案10】:

我猜 - 你是在尝试使用创建 Dialog。

 getApplicationContext()
 mContext which is passed by activity.

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

Activity activity=YourActivity.this;

现在它会很好用。

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

【讨论】:

【参考方案11】:

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

this.getActivity().getParent()

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

public class filtro extends Fragment...

【讨论】:

【参考方案12】:

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

new Dialog(getApplicationContext());

所以我不得不改变:

new Dialog(this);

它对我来说很好;)

【讨论】:

您的答案是正确的,但是只有在您处于活动范围内时才有效。如果您在内部范围内,则必须使用MyActivity.class 而不是this,因为this 指的是不同的对象。 另外,this 将确保您的 Dialog 继承您的主题。

以上是关于Android '无法添加窗口 -- 令牌 null 不适用于应用程序' 异常的主要内容,如果未能解决你的问题,请参考以下文章

无法添加窗口 - 令牌android.os.BinderProxy@42824无效;你的活动在运行吗?

无法添加窗口 - 令牌 null 不适用于广播接收器的 OnReceive 内的应用程序

对话框抛出“无法添加窗口 - 令牌 null 不适用于应用程序”,getApplication() 作为上下文

android.view.WindowManager$BadTokenException

无法使用 API 级别 16 注册 Android 令牌

Android 'BadTokenException 窗口令牌 android.os.BinderProxy@4250d6d8 无效',前台服务正在运行