Android 迁移到FormsApplicationActivity导致NavigationRenderer中出现异常
在我的应用程序中,我将AndroidActivity替换为FormsAppActivity 现在,在扩展NavigationRenderer的自定义呈现程序中,我得到了一个异常,跟踪到方法Xamarin.Forms.Platform.Android.NavigationRenderer.SwitchContentAsync: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
[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.FormsLife saver-我支持这一点。表单应该是开源的。希望微软能做到这一点。@Blueberry我真的希望如此。我的意思是,他们开放了.NET本身的源代码,所以为什么不建立一个像这样的小图书馆呢。我从来都不明白一开始就把它封闭起来的意义。这只会伤害社区,我看不到任何好处。@Blueberry是的,现在好多了,但你知道如何调试源代码吗?@Spacemonkey克隆源代码,删除你的Xamarin.Forms nugget包,添加Xamarin.Forms项目和任何其他必需的项目,并引用它们。Life saver-我支持这一点。表单应该是开源的。希望微软能做到这一点。@Blueberry我真的希望如此。我的意思是,他们开放了.NET本身的源代码,所以为什么不建立一个像这样的小图书馆呢。我从来都不明白一开始就把它封闭起来的意义。这只会伤害社区,我看不到任何好处。@Blueberry是的,现在好多了,但你知道如何调试源代码吗?@Spacemonkey克隆源代码,删除你的Xamarin.Forms nugget包,添加Xamarin.Forms项目和任何其他必需的项目并引用它们。