BadTokenException:无法添加窗口--窗口android.view.ViewRootImpl$W@cb70704已经添加到三星设备上
我使用的是Xamarin for Android,我在AlertDialog.Builder.Show()方法中遇到了这个错误,但它只发生在一些三星(Android 7.0)设备上,我们尝试了一些其他设备,但这个问题没有发生。我只是在使用应用程序一段时间后才得到它。stacktrace如下所示BadTokenException:无法添加窗口--窗口android.view.ViewRootImpl$W@cb70704已经添加到三星设备上,android,xamarin,xamarin.android,Android,Xamarin,Xamarin.android,我使用的是Xamarin for Android,我在AlertDialog.Builder.Show()方法中遇到了这个错误,但它只发生在一些三星(Android 7.0)设备上,我们尝试了一些其他设备,但这个问题没有发生。我只是在使用应用程序一段时间后才得到它。stacktrace如下所示 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <f32579baafc1404f
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <f32579baafc1404fa37ba3ec1abdc0bd>:0
at Java.Interop.JniEnvironment+InstanceMethods.CallObjectMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00069] in <7802aa64ad574c33adca332a3fa9706a>:0
at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0002a] in <7802aa64ad574c33adca332a3fa9706a>:0
at Android.App.AlertDialog+Builder.Show () [0x0000a] in <dc51acef1f304f0dab449a7fc6039799>:0
at Prizma.Controls.Common.BindingComboBox.ShowDialog () [0x00062] in C:\TeamProjects\PrizmaProject\Main\MobileSales.iOS\Prizma.Controls.iOS\Common\BindingComboBox.cs:408
--- End of managed Android.Views.WindowManagerBadTokenException stack trace ---
android.view.WindowManager$BadTokenException: Unable to add window -- window android.view.ViewRootImpl$W@cb70704 has already been added
at android.view.ViewRootImpl.setView(ViewRootImpl.java:902)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:97)
at android.app.Dialog.show(Dialog.java:404)
at android.app.AlertDialog$Builder.show(AlertDialog.java:1136)
at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:30)
at android.view.View.performClick(View.java:6261)
at android.widget.TextView.performClick(TextView.java:11185)
at android.view.View$PerformClick.run(View.java:23752)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
位于System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000c]中:0
在Java.Interop.JniEnvironment+InstanceMethods.CallObjectMethod(Java.Interop.JniObjectReference实例,Java.Interop.JniMethodInfo方法,Java.Interop.JniArgumentValue*args)[0x00069]中:0
在Java.Interop.jnipermembers+JniInstanceMethods.InvokeVirtualObjectMethod(System.String encodedMember,Java.Interop.IJavaPeerable self,Java.Interop.JniArgumentValue*参数)[0x0002a]中:0
在0中的Android.App.AlertDialog+Builder.Show()[0x0000a]处
在C:\TeamProject\PrizmaProject\Main\MobileSales.iOS\Prizma.Controls.iOS\Common\BindingComboBox.ShowDialog()中的Prizma.Controls.Common.BindingComboBox.ShowDialog()[0x00062]处:408
---托管Android.Views.WindowManagerBadtokenexException堆栈跟踪结束---
android.view.WindowManager$BadTokenException:无法添加窗口--window android.view.ViewRootImpl$W@cb70704已经添加了
在android.view.ViewRootImpl.setView(ViewRootImpl.java:902)
在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377)
在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:97)
在android.app.Dialog.show上(Dialog.java:404)
在android.app.AlertDialog$Builder.show上(AlertDialog.java:1136)
在mono.android.view.view\u OnClickListenerImplementor.n\u onClick(本机方法)
在mono.android.view.view\u OnClickListenerImplementor.onClick(view\u OnClickListenerImplementor.java:30)
在android.view.view.performClick上(view.java:6261)
在android.widget.TextView.performClick上(TextView.java:11185)
在android.view.view$PerformClick.run(view.java:23752)
位于android.os.Handler.handleCallback(Handler.java:751)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6776)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
我的代码是这样的
try
{
AlertDialog.Builder a = new AlertDialog.Builder(MainActivity);
a.SetTitle("Select");
a.SetAdapter(_Adapter, new EventHandler<DialogClickEventArgs>(ClosedDialog));
a.Create();
a.Show();
}
catch (Exception ex)
{
//Exception code
}
试试看
{
AlertDialog.Builder a=新建AlertDialog.Builder(MainActivity);
a、 SetTitle(“选择”);
a、 SetAdapter(_Adapter,neweventhandler(ClosedDialog));
a、 创建();
a、 Show();
}
捕获(例外情况除外)
{
//例外代码
}
我将AlertDialog.Builder Show()方法放入了一个Try Catch中,但是在我第一次得到异常之后,每次都会得到它
一些评论
- 即使应用程序从未进入后台,我仍然会遇到这个错误
- 该应用程序使用最新的Android SDK(8.1)编译
- 我没有最新版本的Xamarin Android,但现在我有了,问题仍然存在
- 错误发生后,不仅AlertDialogs没有显示,弹出菜单也没有显示
- 我用安卓6.0.1买了一个三星Galaxy J7 Prime,这个错误没有发生,但升级到7.0后问题开始了。在其他设备中,如摩托罗拉、Hawuei、LG等。。我们没有这个问题,即使他们有安卓7.0
Allan在一个片段中显示这样的对话框:
在活动中使用if(!IsFinishing)
if (!((Activity)Context).IsFinishing)
{
try
{
AlertDialog.Builder a = new AlertDialog.Builder(MainActivity);
a.SetTitle("Select");
a.SetAdapter(_Adapter, new EventHandler<DialogClickEventArgs>(ClosedDialog));
a.Create();
a.Show();
}
catch (Exception ex)
{
//Exception code
}
}
if(!((活动)上下文).IsFinishing)
{
尝试
{
AlertDialog.Builder a=新建AlertDialog.Builder(MainActivity);
a、 SetTitle(“选择”);
a、 SetAdapter(_Adapter,neweventhandler(ClosedDialog));
a、 创建();
a、 Show();
}
捕获(例外情况除外)
{
//例外代码
}
}
您正在将一个对话框添加到一个已停止的活动中,因此在显示对话框之前,您应该检查该活动是否已通过以下步骤完成:
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setTitle(R.string.app_name);
builder.setMessage(msg);
AlertDialog alert = builder.create();
//To check if activity is finished
if (!((Activity)ctx).isFinishing()) {
alert.show();
}
试试看
{
RunOnUiThread(()=>{
AlertDialog.Builder a=新建AlertDialog.Builder(MainActivity);
a、 SetTitle(“选择”);
a、 SetAdapter(_Adapter,neweventhandler(ClosedDialog));
a、 创建();
a、 Show();
});
}
捕获(例外情况除外)
{
//例外代码
}
请参阅:
WindowManagerBadtokenexException
通常是一个不好的上下文,或者在显示期间您不在主/ui线程上,以及您如何取消注册和处理您在其中新创建的EventHandler。或者,您的适配器是否使用线程?仅供参考,您不需要调用Create
,因为您没有存储生成的AlertDialog
。谢谢@SushiHangover的回答。我会考虑你的意见。但这个问题的奇怪之处在于,在第一次失败之前,每个对话框o PopupMenu都会在Show()方法上抛出这个异常。我在Xamarin/Android开发方面没有太多经验,但我认为正如你所说的,问题与上下文有关,但我总是在上下文中使用相同的活动,应用程序从不进入后台。@user9950487你能解决这个问题吗?您好@user427969我还没有解决这个问题,是吗?Thanks@user9950487不,我还没有决定。我已经按照答案的建议尝试添加了isFinishing
。嗨,谢谢。
try
{
RunOnUiThread (() => {
AlertDialog.Builder a = new AlertDialog.Builder(MainActivity);
a.SetTitle("Select");
a.SetAdapter(_Adapter, new EventHandler<DialogClickEventArgs>(ClosedDialog));
a.Create();
a.Show();
});
}
catch (Exception ex)
{
//Exception code
}