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
Android 迁移到FormsApplicationActivity导致NavigationRenderer中出现异常_Android_Xamarin_Xamarin Forms - Fatal编程技术网

Android 迁移到FormsApplicationActivity导致NavigationRenderer中出现异常

Android 迁移到FormsApplicationActivity导致NavigationRenderer中出现异常,android,xamarin,xamarin-forms,Android,Xamarin,Xamarin Forms,在我的应用程序中,我将AndroidActivity替换为FormsAppActivity 现在,在扩展NavigationRenderer的自定义呈现程序中,我得到了一个异常,跟踪到方法Xamarin.Forms.Platform.Android.NavigationRenderer.SwitchContentAsync: [MonoDroid] UNHANDLED EXCEPTION: [MonoDroid] System.InvalidCastException: Cannot cast

在我的应用程序中,我将AndroidActivity替换为FormsAppActivity

现在,在扩展NavigationRenderer的自定义呈现程序中,我得到了一个异常,跟踪到方法Xamarin.Forms.Platform.Android.NavigationRenderer.SwitchContentAsync:

[MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] System.InvalidCastException: Cannot cast from source type to destination type.
[MonoDroid] at Xamarin.Forms.Platform.Android.NavigationRenderer.SwitchContentAsync (Xamarin.Forms.Page,bool,bool) <IL 0x000bd, 0x003fe>
[MonoDroid] at Xamarin.Forms.Platform.Android.NavigationRenderer.OnPushAsync (Xamarin.Forms.Page,bool) <IL 0x00004, 0x0003f>
[MonoDroid] at Xamarin.Forms.Platform.Android.NavigationRenderer.PushViewAsync (Xamarin.Forms.Page,bool) <IL 0x00003, 0x00036>
[MonoDroid] at Xamarin.Forms.Platform.Android.NavigationRenderer.<OnElementChanged>b__4_0 (Xamarin.Forms.Page) <IL 0x00003, 0x00033>
[MonoDroid] at Xamarin.Forms.EnumerableExtensions.ForEach<Xamarin.Forms.Page> (System.Collections.Generic.IEnumerable`1<Xamarin.Forms.Page>,System.Action`1<Xamarin.Forms.Page>) <0x000bf>
[MonoDroid] at Xamarin.Forms.Platform.Android.NavigationRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs`1<Xamarin.Forms.NavigationPage>) <IL 0x000ea, 0x006ff>
[MonoDroid] at Boats.Droid.PageFancyRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs`1<Xamarin.Forms.NavigationPage>) [0x00001] in d:\Code\Boats\Droid\Renderers\NavigationPageFancy.cs:33
[MonoDroid]未处理的异常:
[MonoDroid]System.InvalidCastException:无法从源类型强制转换为目标类型。
[MonoDroid]位于Xamarin.Forms.Platform.Android.NavigationRenderer.SwitchContentAsync(Xamarin.Forms.Page,bool,bool)
[MonoDroid]位于Xamarin.Forms.Platform.Android.NavigationRenderer.OnPushAsync(Xamarin.Forms.Page,bool)
[MonoDroid]位于Xamarin.Forms.Platform.Android.NavigationRenderer.PushViewAsync(Xamarin.Forms.Page,bool)
[MonoDroid]位于Xamarin.Forms.Platform.Android.NavigationRenderer.b_u4_0(Xamarin.Forms.Page)
[MonoDroid]位于Xamarin.Forms.EnumerableExtensions.ForEach(System.Collections.Generic.IEnumerable`1,System.Action`1)
[MonoDroid]位于Xamarin.Forms.Platform.Android.NavigationRenderer.OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs`1)
[MonoDroid]位于boots.Droid.PageFancyRenderer.OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs`1)[0x00001]的d:\Code\boots\Droid\renders\NavigationPageFancy.cs:33
因为我没有Xamarin.Forms的源代码,所以我无法介入。该方法的反编译是


有什么想法吗?

这是因为AppCompat引入了一个新的NavigationRenderer,所以我应该将其子类化,而不是在Xamarin.Forms.Platform.Android中

因此,解决方案是:

public class PageFancyRenderer : Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer
而不是:

public class PageFancyRenderer : Xamarin.Forms.Platform.Android.NavigationPageRenderer

发生此错误的原因:

在NavigationPageRenderer.SwitchContentAsync中有一行:

          ((Platform) this.Element.Platform).NavAnimationInProgress = false;
这是对Android.Platform类的转换,因为我是Android.NavigationRenderer的子类

正确的渲染器Android.AppCompat.NavigationRenderer将强制转换到元素的正确平台(使用AppCompatActivity时),即Android.AppCompat.platform

如果Xamarin.Forms是open-souce,这将更容易捕获,因为我将能够实际调试代码,但相反,我必须查看IL反汇编以找到导致错误的行


为了社区的利益,请开源Xamarin.Forms

这是因为AppCompat引入了一个新的NavigationRenderer,所以我应该将其子类化,而不是Xamarin.Forms.Platform.Android中的子类化

因此,解决方案是:

public class PageFancyRenderer : Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer
而不是:

public class PageFancyRenderer : Xamarin.Forms.Platform.Android.NavigationPageRenderer

发生此错误的原因:

在NavigationPageRenderer.SwitchContentAsync中有一行:

          ((Platform) this.Element.Platform).NavAnimationInProgress = false;
这是对Android.Platform类的转换,因为我是Android.NavigationRenderer的子类

正确的渲染器Android.AppCompat.NavigationRenderer将强制转换到元素的正确平台(使用AppCompatActivity时),即Android.AppCompat.platform

如果Xamarin.Forms是open-souce,这将更容易捕获,因为我将能够实际调试代码,但相反,我必须查看IL反汇编以找到导致错误的行


为了社区的利益,请开源Xamarin.Forms

Life saver-我支持这一点。表单应该是开源的。希望微软能做到这一点。@Blueberry我真的希望如此。我的意思是,他们开放了.NET本身的源代码,所以为什么不建立一个像这样的小图书馆呢。我从来都不明白一开始就把它封闭起来的意义。这只会伤害社区,我看不到任何好处。@Blueberry是的,现在好多了,但你知道如何调试源代码吗?@Spacemonkey克隆源代码,删除你的Xamarin.Forms nugget包,添加Xamarin.Forms项目和任何其他必需的项目,并引用它们。Life saver-我支持这一点。表单应该是开源的。希望微软能做到这一点。@Blueberry我真的希望如此。我的意思是,他们开放了.NET本身的源代码,所以为什么不建立一个像这样的小图书馆呢。我从来都不明白一开始就把它封闭起来的意义。这只会伤害社区,我看不到任何好处。@Blueberry是的,现在好多了,但你知道如何调试源代码吗?@Spacemonkey克隆源代码,删除你的Xamarin.Forms nugget包,添加Xamarin.Forms项目和任何其他必需的项目并引用它们。