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
Android 'BadTokenException 窗口令牌 android.os.BinderProxy@4250d6d8 无效',前台服务正在运行