You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms Android应用切换系统深色模式时OnCreate抛出NotSupportedException异常

异常产生原因

该异常是Xamarin.Forms Shell相关的兼容性问题,触发逻辑如下:

  1. 系统切换深色模式时,Android默认会销毁当前Activity并重建以加载适配深色模式的资源
  2. Activity重建执行到base.OnCreate时,Xamarin.Forms会反射初始化Shell对应的渲染器
  3. 低版本Xamarin.Forms的Xamarin.Forms.Platform.Android.ShellItemRenderer未提供系统反射需要的带Context参数的构造函数,或是你自定义的ShellItemRenderer缺失必要构造函数,就会抛出找不到构造函数的异常
  4. 你当前代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:27:02