自定义BottomSheet继承CoordinatorLayout遇VTable初始化失败求助
问题解决:自定义BottomSheet继承Support库CoordinatorLayout触发AndroidX类型加载异常
异常原因
你遇到的System.TypeLoadException本质是项目中混合了Android Support库与AndroidX库,导致类型加载冲突。即使代码显式继承自Android.Support.Design.Widget.CoordinatorLayout,但项目中其他依赖(比如你使用的AnchoredBottomSheetBehavior)或NuGet包可能间接引用了AndroidX版本的CoordinatorLayout,运行时CLR无法正确区分两个版本的类型,从而触发VTable初始化失败。
解决方案
1. 完全迁移到AndroidX库
Xamarin已停止维护Android Support库,混合使用必然出现兼容性问题,需统一替换为AndroidX对应库:
- 移除所有以
Android.Support.开头的NuGet包 - 添加以下AndroidX替代包:
Xamarin.AndroidX.Material(对应原Support.Design)Xamarin.AndroidX.Core(对应原Support.V4)Xamarin.AndroidX.CoordinatorLayout
2. 修改代码命名空间引用
将代码中所有Support库的命名空间替换为AndroidX版本:
// 替换前 using Android.Support.Design.Widget; using Android.Support.V4.Widget; // 替换后 using AndroidX.CoordinatorLayout.Widget; using AndroidX.Core.Widget;
同时确认AnchoredBottomSheetBehavior的实现也基于AndroidX库的类,比如它应该继承自AndroidX.CoordinatorLayout.Widget.CoordinatorLayout.Behavior而非Support版本。
3. 清理并重建项目
- 右键项目 → 选择「清理」
- 删除项目目录下的
bin和obj文件夹 - 重新还原NuGet包(右键项目 → 「还原NuGet包」)
- 重新构建项目
修正后的部分代码示例
using System; using Android.Content; using Android.Graphics; using Android.Runtime; using AndroidX.CoordinatorLayout.Widget; using AndroidX.Core.Widget; using Android.Util; using Android.Views; using Android.Widget; using XBottomSheet.Droid.Behaviors; namespace XBottomSheet.Droid.Views { public class XBottomSheetView : CoordinatorLayout { private AnchoredBottomSheetBehavior behavior; private NestedScrollView contentScroller; // 其余属性、构造函数、方法保持不变,仅命名空间替换 #region Properties public int PeekHeight { get { return behavior.PeekHeight; } set { behavior.PeekHeight = value; } } // 其他属性... #endregion #region Constructors public XBottomSheetView(Context context) : base(context) {} public XBottomSheetView(Context context, IAttributeSet attrs) : base(context, attrs) { behavior = new AnchoredBottomSheetBehavior(context, attrs); contentScroller = new NestedScrollView(context); contentScroller.SetBackgroundColor(Color.LightGray); ContentView = new FrameLayout(context); } // 其他构造函数... #endregion public void AddStateChangedEvent(EventHandler onStateChanged) { behavior.StateChanged += onStateChanged; } } }
内容的提问来源于stack exchange,提问作者Sudhanshu
相关产品推荐
相关产品推荐

