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

在.NET MAUI Android中设置自定义Toolbar遇阻求助

解决.NET MAUI中自定义NavigationPage Toolbar的问题

核心问题分析

你遇到的FindViewById返回null,本质是MAUI的NavigationPage布局是动态渲染的,在MainActivity.OnCreate阶段,NavigationPage的Toolbar还未被初始化;而原Xamarin.Forms的ToolbarResource属性在MAUI中已不再直接支持,需要通过Handler机制替换默认Toolbar。

分步解决方案

1. 确保自定义Toolbar布局正确

在Platforms/Android/Resources/layout/Toolbar.axml中,必须使用AndroidX版本的Toolbar(避免类型转换错误),示例结构如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

2. 通过NavigationViewHandler替换默认Toolbar

在Platforms/Android/MainActivity.cs或Program.cs中,注册自定义Handler映射,在NavigationPage渲染完成后替换Toolbar:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    // 注册NavigationView的自定义映射
    Microsoft.Maui.Handlers.NavigationViewHandler.Mapper.AppendToMapping("CustomToolbar", (handler, navigationPage) =>
    {
        var context = handler.Context;
        var appBarLayout = handler.View.FindViewById<AndroidX.AppCompat.Widget.AppBarLayout>(Resource.Id.navigationlayout_appbar);
        
        if (appBarLayout == null) return;

        // 移除默认Toolbar
        var defaultToolbar = appBarLayout.FindViewById<AndroidX.AppCompat.Widget.Toolbar>(Resource.Id.navigationlayout_toolbar);
        if (defaultToolbar != null)
        {
            appBarLayout.RemoveView(defaultToolbar);
        }

        // 加载自定义Toolbar并添加到布局
        var customToolbar = LayoutInflater.From(context)
            .Inflate(Resource.Layout.Toolbar, appBarLayout, false) as AndroidX.AppCompat.Widget.Toolbar;
        
        if (customToolbar != null)
        {
            // 绑定MAUI NavigationPage的核心属性
            customToolbar.Title = navigationPage.CurrentPage.Title;
            appBarLayout.AddView(customToolbar);
            
            // 将自定义Toolbar关联到Handler,确保MAUI的导航逻辑正常工作
            handler.Toolbar = customToolbar;

            // 监听页面切换,更新Toolbar内容
            navigationPage.CurrentPageChanged += (s, e) =>
            {
                customToolbar.Title = navigationPage.CurrentPage.Title;
                // 同步ToolbarItems(可选)
                customToolbar.Menu.Clear();
                navigationPage.CurrentPage.ToolbarItems.ForEach(item =>
                {
                    var menuItem = customToolbar.Menu.Add(item.Text);
                    menuItem.SetShowAsAction(item.Order == ToolbarItemOrder.Primary ? ShowAsAction.Always : ShowAsAction.Never);
                    menuItem.Click += (sender, args) => item.Command?.Execute(null);
                });
            };
        }
    });
}

3. 关键注意事项

  • 清理并重建项目,确保Resource.designer.cs已更新,能正确识别Resource.Id.toolbar;
  • 所有Toolbar操作必须在NavigationViewHandler的映射中执行,避免在Activity初始化阶段直接查找控件;
  • 确保自定义Toolbar使用androidx.appcompat.widget.Toolbar而非Material版Toolbar,解决类型转换报错问题。

内容的提问来源于stack exchange,提问作者Dorian Olarescu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:50:12