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

Android中通过NavigationPageRenderer在ToolbarItem中间加自定义视图失败求助

解决Android NavigationPageRenderer添加自定义视图到Toolbar中间不生效的问题

我来帮你搞定这个问题!你遇到的自定义视图没显示在Toolbar中间的情况,大概率是因为OnViewAdded的时机不对,或者没正确定位到Toolbar的容器,咱们一步步来修复:

核心问题分析

OnViewAdded会在多个视图添加时触发,很可能在Toolbar还没完全初始化完成时就执行了,导致自定义视图没加对地方;另外,你可能没给自定义视图设置正确的布局参数,就算加进去了也看不到。

解决方案代码示例

咱们换个更可靠的方式,通过监听页面导航事件,在目标页面加载时添加自定义视图:

using Android.Content;
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(NavigationPage), typeof(CustomNavigationPageRenderer))]
namespace YourAppNamespace.Droid.Renderers
{
    public class CustomNavigationPageRenderer : NavigationPageRenderer
    {
        private Toolbar _toolbar;
        private View _customToolbarView;

        public CustomNavigationPageRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                // 监听页面的推送和弹出事件,实时更新Toolbar
                Element.Pushed += OnPagePushed;
                Element.Popped += OnPagePopped;
            }
        }

        private void OnPagePushed(object sender, NavigationEventArgs e)
        {
            UpdateCustomToolbarView(e.Page);
        }

        private void OnPagePopped(object sender, NavigationEventArgs e)
        {
            // 页面弹出后,更新为当前栈顶的页面视图
            UpdateCustomToolbarView(Navigation.NavigationStack.LastOrDefault());
        }

        private void UpdateCustomToolbarView(Page currentPage)
        {
            // 先找到Toolbar控件,不同项目可能id不同,这里是默认的toolbar id
            _toolbar = FindViewById<Toolbar>(Resource.Id.toolbar);
            if (_toolbar == null) return;

            // 移除旧的自定义视图,避免重复添加
            if (_customToolbarView != null)
            {
                _toolbar.RemoveView(_customToolbarView);
                _customToolbarView = null;
            }

            // 只在ParentDashboardPage页面添加自定义视图
            if (currentPage?.GetType().Name == "ParentDashboardPage")
            {
                // 加载你的自定义布局
                LayoutInflater inflater = LayoutInflater.From(Context);
                _customToolbarView = inflater.Inflate(Resource.Layout.YourCustomToolbarView, _toolbar, false);

                // 设置布局参数,让视图居中显示在Toolbar
                var layoutParams = new Toolbar.LayoutParams(
                    ViewGroup.LayoutParams.WrapContent,
                    ViewGroup.LayoutParams.WrapContent)
                {
                    Gravity = GravityFlags.Center
                };

                // 添加到Toolbar中
                _toolbar.AddView(_customToolbarView, layoutParams);

                // 如果需要隐藏默认的标题,可以加上这句
                // _toolbar.Title = string.Empty;
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                // 记得取消事件监听,避免内存泄漏
                Element.Pushed -= OnPagePushed;
                Element.Popped -= OnPagePopped;
            }
            base.Dispose(disposing);
        }
    }
}

关键注意事项

  • 自定义布局要正确:确保YourCustomToolbarView.axml的布局宽高设置合理,比如用wrap_content或者固定尺寸
  • Toolbar的ID适配:如果找不到Resource.Id.toolbar,可以试试Resource.Id.action_bar,或者通过遍历_toolbar.ChildCount找到对应的容器视图
  • 布局参数是关键:一定要设置Gravity = GravityFlags.Center,不然自定义视图可能会跑到左边或右边
  • 清理旧视图:每次页面切换时移除旧的自定义视图,避免重复叠加

内容的提问来源于stack exchange,提问作者Arvind Chourasiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:55:32