.NET MAUI升级至.NET 10后TabBar与Android导航按钮重叠问题
.NET MAUI 升级到.NET 10后TabBar与Android系统导航按钮重叠的解决方法
我正在调试一款.NET MAUI应用,近期从.NET 9.0升级到.NET 10.0后,整体过渡较为顺畅,但底部的Shell TabBar出现异常:Android系统导航按钮与该TabBar发生重叠。TabBar代码未随版本变更,请问如何恢复适配Android按钮的安全区域?
.NET 9.0正常效果:
.NET 10.0异常效果:
TabBar代码如下:
<TabBar Route="MainPage"> <ShellContent Title="{x:Static strings:AppResources.Home}" ContentTemplate="{DataTemplate landingviews:LandingPage}" Icon="landing_page_icon.png" Route="Landing" /> <ShellContent Title="{x:Static strings:AppResources.Investments}" ContentTemplate="{DataTemplate investmentviews:InvestmentDetailsPage}" Icon="investments_page_icon.png" Route="Catalog" /> <ShellContent Title="{x:Static strings:AppResources.Documents}" ContentTemplate="{DataTemplate documentviews:DocumentPage}" Icon="documents_page_icon.png" Route="Document" /> <ShellContent Title="{x:Static strings:AppResources.Advisor}" ContentTemplate="{DataTemplate advisorviews:AdvisorPage}" Icon="advisor_page_icon.png" Route="Advisor" /> <ShellContent Title="{x:Static strings:AppResources.More}" ContentTemplate="{DataTemplate moreviews:MorePage}" Icon="more_page_icon.png" Route="More" /> </TabBar>
解决方法
方法1:启用TabBar安全区域属性
直接在TabBar标签中添加Shell.TabBarSafeAreaEnabled="True",强制开启安全区域适配,这是最直接的修复方式:
<TabBar Route="MainPage" Shell.TabBarSafeAreaEnabled="True"> <!-- 保留原有ShellContent内容 --> </TabBar>
方法2:全局配置Shell安全区域
如果单个TabBar设置无效,可在AppShell的根Shell标签中全局启用安全区域:
<Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:views="clr-namespace:YourAppNamespace.Views" x:Class="YourAppNamespace.AppShell" Shell.TabBarSafeAreaEnabled="True"> <!-- 原有TabBar及其他内容 --> </Shell>
方法3:Android平台自定义适配
若上述方法仍未解决,可通过Android平台的Handler自定义TabBar的边距,适配系统导航栏高度:
在Android项目的Platforms/Android/MainActivity.cs中,添加如下代码:
using Microsoft.Maui.Handlers; using AndroidX.AppCompat.Widget; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Platform.Init(this, savedInstanceState); // 自定义Shell TabBar的底部边距 ShellHandler.Mapper.AppendToMapping("TabBarSafeAreaFix", (handler, view) => { if (handler.PlatformView is Toolbar toolbar) { var insets = Platform.CurrentActivity.WindowInsetsController?.GetInsets(Android.Views.WindowInsets.Type.SystemBars()); if (insets != null) { toolbar.SetPadding(toolbar.PaddingLeft, toolbar.PaddingTop, toolbar.PaddingRight, insets.Bottom); } } }); }
内容的提问来源于stack exchange,提问作者Mini




