Xamarin.Forms Android应用切换系统深色模式时OnCreate抛出NotSupportedException异常
异常产生原因
该异常是Xamarin.Forms Shell相关的兼容性问题,触发逻辑如下:
- 系统切换深色模式时,Android默认会销毁当前Activity并重建以加载适配深色模式的资源
- Activity重建执行到
base.OnCreate时,Xamarin.Forms会反射初始化Shell对应的渲染器 - 低版本Xamarin.Forms的
Xamarin.Forms.Platform.Android.ShellItemRenderer未提供系统反射需要的带Context参数的构造函数,或是你自定义的ShellItemRenderer缺失必要构造函数,就会抛出找不到构造函数的异常 - 你当前代码中
base.OnCreate调用顺序早于Xamarin.Forms.Forms.Init,也会导致渲染器初始化时依赖的框架环境未准备完成,触发该错误
排查解决步骤
- 升级Xamarin.Forms到最新稳定版,该问题是Xamarin.Forms 4.x早期版本的已知Bug,5.0及以上的稳定版已经修复了ShellItemRenderer构造函数缺失的问题
- 调整MainActivity的OnCreate方法执行顺序,将
base.OnCreate移到所有框架初始化逻辑之后,修改后参考代码:
protected override void OnCreate(Bundle savedInstanceState) { CrossFingerprint.SetCurrentActivityResolver(() => this); TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; // 先完成所有依赖组件初始化 Xamarin.Essentials.Platform.Init(this, savedInstanceState); ZXing.Net.Mobile.Forms.Android.Platform.Init(); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); Xamarin.FormsGoogleMaps.Init(this, savedInstanceState); // 再调用基类OnCreate base.OnCreate(savedInstanceState); Window.DecorView.LayoutDirection = LayoutDirection.Rtl; LoadApplication(new App()); }
- 给MainActivity添加配置避免深色模式切换时重建Activity,在MainActivity的
[Activity]特性中添加ConfigChanges = ConfigChanges.UiMode | ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.LayoutDirection,这样系统切换深色模式时不会销毁重建Activity,直接回调OnConfigurationChanged方法即可完成适配,避免触发渲染器重复初始化的问题 - 如果你自定义了ShellItemRenderer,需要确保自定义渲染器提供了带Context参数的构造函数,参考代码:
public class CustomShellItemRenderer : ShellItemRenderer { // 必须保留该构造函数供Xamarin.Forms反射调用 public CustomShellItemRenderer(Context context) : base(context) { } }
内容的提问来源于stack exchange,提问作者user16342153
相关产品推荐
相关产品推荐

