You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.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 9.0下TabBar正常显示

.NET 10.0异常效果:
.NET 10.0下TabBar与系统导航按钮重叠

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

火山引擎 最新活动