Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BadTokenException:无法添加窗口--窗口android.view.ViewRootImpl$W@cb70704已经添加到三星设备上_Android_Xamarin_Xamarin.android - Fatal编程技术网

BadTokenException:无法添加窗口--窗口android.view.ViewRootImpl$W@cb70704已经添加到三星设备上

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

我使用的是Xamarin for Android,我在AlertDialog.Builder.Show()方法中遇到了这个错误,但它只发生在一些三星(Android 7.0)设备上,我们尝试了一些其他设备,但这个问题没有发生。我只是在使用应用程序一段时间后才得到它。stacktrace如下所示

  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
}