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

.NET MAUI 8中如何根据条件隐藏底部TabbedPage?

解决MAUI Android隐藏底部标签栏后仍留空白的问题

你当前的问题出在:只修改了底部导航栏的高度或可见性,但TabbedPage的内容容器或根布局依然保留了为底部栏预留的空白区域。要彻底消除空白,需要同时调整页面内容的布局参数,让内容填充原本底部栏占据的空间。

以下是修正后的实现代码:

public static PropertyMapper<BaseBottomBarTabbedPage, CustomTabbedPageHandler> BottomBarMapper = new(Mapper)
{
    [nameof(BaseBottomBarTabbedPage.IsBottomBarVisible)] = IsBottomBarVisibleOrNot
};

private static void IsBottomBarVisibleOrNot(CustomTabbedPageHandler handler, BottomBarTabbedPage baseBottomBarTabbedPage)
{
    try
    {
        if (handler == null || handler.PlatformView == null || baseBottomBarTabbedPage == null)
            return;

        var context = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity.ApplicationContext;
        var flags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;
        Type tabbedPageType = typeof(Microsoft.Maui.Controls.TabbedPage);
        var tabManager = tabbedPageType.GetField("_tabbedPageManager", flags)?.GetValue(baseBottomBarTabbedPage);
        var bottomNavigation = tabManager?.GetType().GetField("_bottomNavigationView", flags)?.GetValue(tabManager);

        if (bottomNavigation is Google.Android.Material.BottomNavigation.BottomNavigationView bottomBar)
        {
            int resourceId = context.Resources.GetIdentifier("design_bottom_navigation_height", "dimen", context.PackageName);
            int bottomBarHeight = resourceId > 0 ? context.Resources.GetDimensionPixelSize(resourceId) : 0;

            // 处理底部栏的可见性与高度
            if (baseBottomBarTabbedPage.IsBottomBarVisible)
            {
                bottomBar.Visibility = Android.Views.ViewStates.Visible;
                bottomBar.LayoutParameters.Height = bottomBarHeight;
                // 恢复内容区域的底部padding
                if (handler.PlatformView is Android.Views.ViewGroup rootView)
                {
                    rootView.SetPadding(rootView.PaddingLeft, rootView.PaddingTop, rootView.PaddingRight, bottomBarHeight);
                }
            }
            else
            {
                bottomBar.Visibility = Android.Views.ViewStates.Gone;
                bottomBar.LayoutParameters.Height = 0;
                // 移除内容区域的底部padding,让内容填充到底部
                if (handler.PlatformView is Android.Views.ViewGroup rootView)
                {
                    rootView.SetPadding(rootView.PaddingLeft, rootView.PaddingTop, rootView.PaddingRight, 0);
                }
            }

            // 强制刷新布局
            bottomBar.RequestLayout();
            handler.PlatformView.RequestLayout();
        }
    }
    catch (Exception ex)
    {
        Crashes.TrackError(ex);
    }
}

关键修复点:

  • 不仅修改底部栏的高度,同时调整TabbedPage根布局的底部padding:显示底部栏时恢复padding,隐藏时将padding设为0,让内容填充整个屏幕。
  • 使用Gone代替仅设置高度为0:Gone会让视图完全从布局中移除,不占据任何空间,配合padding调整彻底消除空白。
  • 调用RequestLayout()强制布局刷新,确保修改立即生效。

如果上述代码仍有问题,你可以尝试直接获取TabbedPage的内容容器(比如找到FrameLayout或CoordinatorLayout),调整其布局参数的bottomMargin,原理和调整padding一致。

内容的提问来源于stack exchange,提问作者Satya K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:42:36