Xamarin.Forms自定义Android NavigationPageRenderer标题和副标题

目前正在开发一个我想使用AppCompat的项目,并且在大多数页面上都要求设置标题和副标题.

它根本不能使用AppCompat – 既不设置属性也不使用自定义视图.

不使用AppCompat时,两者都按预期工作.完整的源代码可用here所以如果你好奇的话就运行应用程序:)

using System.ComponentModel;
using Android.App;
using Android.Widget;
using App1.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
#if __APPCOMPAT__
using NavigationRenderer = Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer;
#else
using NavigationRenderer = Xamarin.Forms.Platform.Android.NavigationRenderer;
#endif

[assembly: ExportRenderer(typeof(NavigationPage),typeof(NavigationPageRenderer))]

namespace App1.Droid.Renderers
{
    public class NavigationPageRenderer : NavigationRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
        {
            base.OnElementChanged(e);
            SetCustomView(e.NewElement.CurrentPage.GetType().Name);
        }

        private void SetCustomView(string view)
        {
            var activity = (Activity)Context;
#if __APPCOMPAT__
            var actionBar = ((FormsAppCompatActivity)Context).SupportActionBar;
#else
            var actionBar = activity.ActionBar;
#endif
            actionBar.Title = view;
            actionBar.Subtitle = " -> " + view;
            var abv = new LinearLayout(activity)
            {
                Orientation = Orientation.Vertical
            };

            var main = new TextView(activity)
            {
                Text = view,};
            main.SetTextColor(Color.Aqua.ToAndroid());
            main.SetPadding(4,4,2,6);
            abv.AddView(main);
            abv.AddView(new TextView(activity)
            {
                Text = " -> " + view
            });
            actionBar.SetdisplayShowCustomEnabled(true);
            actionBar.CustomView = abv;
        }

        protected override void OnElementPropertyChanged(object sender,PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender,e);
            if (e.PropertyName.Equals("CurrentPage"))
            {
                SetCustomView(((NavigationPage)sender).CurrentPage.GetType().Name);
            }
        }
    }
}

编辑:谢谢@jimmgarr.稍微改变代码以保持AppCompbat和“正常模式”之间的交替.该代码可用于here

解决方法

所以它看起来像NavigationPage uses its own Toolbar instance.这就是为什么在SupportActionBar上设置属性没有做任何事情.

我能够通过覆盖OnViewAdded()来获得它的工作,以便在添加时获得对新工具栏的引用:

public override void OnViewAdded(Android.Views.View child)
{
    base.OnViewAdded(child);

    if (child.GetType() == typeof(Support.Toolbar))
        toolbar = (Support.Toolbar)child; 
}

然后使用SetCustomView()内部的引用来设置Subtitle,因为Title已经自动设置.

Here’s the complete renderer class

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...