Xamarin报CS0535:CustomBottomNavAppearance未实现SetAppearance接口成员
Xamarin.Forms 5.x Android端自定义ShellRenderer报CS0535错误解决
问题现象
使用Xamarin搭配Visual Studio 2019开发应用时,通过自定义ShellRenderer实现TabBar样式定制,参考的同需求示例项目可在本地正常运行,但将逻辑移植到自有项目后,Android端构建失败(错误码CS0535,报错位置第32行),iOS端构建无同类报错。
报错信息如下:
'CustomBottomNavAppearance' does not implement interface member 'IShellBottomNavViewAppearanceTracker.SetAppearance(BottomNavigationView,IShellAppearanceElement)'
出问题的MyShellRenderer.cs完整代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using Google.Android.Material.BottomNavigation; using MyProject; using MyProject.Droid; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; [assembly: ExportRenderer(typeof(AppShell), typeof(MyShellRenderer))] namespace MyProject.Droid { public class MyShellRenderer : ShellRenderer { public MyShellRenderer(Context context) : base(context) { } protected override IShellBottomNavViewAppearanceTracker CreateBottomNavViewAppearanceTracker(ShellItem shellItem) { return new CustomBottomNavAppearance(); } } public class CustomBottomNavAppearance : IShellBottomNavViewAppearanceTracker { public void Dispose() { } public void ResetAppearance(BottomNavigationView bottomView) { } public void SetAppearance(BottomNavigationView bottomView, ShellAppearance appearance) { IMenu myMenu = bottomView.Menu; IMenuItem myItemOne = myMenu.GetItem(0); if (myItemOne.IsChecked) { myItemOne.SetIcon(Resource.Drawable.icon_about); } else { myItemOne.SetIcon(Resource.Drawable.icon_feed); } } } }
根因分析
该问题为Xamarin.Forms版本适配导致的接口签名不匹配:
- Xamarin.Forms 4.x版本依赖旧的Android Support库,
IShellBottomNavViewAppearanceTracker接口的SetAppearance方法第二个参数类型为ShellAppearance,对应类型位于Android.Support.Design.Widget命名空间下,目前相关库已全部废弃。 - Xamarin.Forms 5.x版本已全面迁移至AndroidX生态,对应接口的
SetAppearance方法第二个参数类型变更为IShellAppearanceElement,依赖Google.Android.Material.BottomNavigation命名空间下的类型。 - 移植代码时未匹配目标项目的Xamarin.Forms版本,方法签名和接口要求不一致,因此编译器提示未实现接口成员。
修复方案
- 清理项目中旧的Android Support库相关引用,确认已安装Xamarin.Forms 5.x匹配的AndroidX依赖包,避免类型冲突。
- 修正
SetAppearance方法的参数类型,确保方法签名和当前版本接口要求完全一致,修正后的方法代码如下:
public void SetAppearance(BottomNavigationView bottomView, IShellAppearanceElement appearance) { IMenu myMenu = bottomView.Menu; IMenuItem myItemOne = myMenu.GetItem(0); if (myItemOne.IsChecked) { myItemOne.SetIcon(Resource.Drawable.icon_about); } else { myItemOne.SetIcon(Resource.Drawable.icon_feed); } }
- 确认代码中已引入正确的命名空间,和项目使用的Xamarin.Forms版本匹配,不要同时混用新旧命名空间导致类型解析冲突。
修改完成后重新构建项目即可正常通过编译。
内容的提问来源于stack exchange,提问作者user19282462
相关产品推荐
相关产品推荐

