Android中通过NavigationPageRenderer在ToolbarItem中间加自定义视图失败求助
我来帮你搞定这个问题!你遇到的自定义视图没显示在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
相关产品推荐
相关产品推荐

