【问题标题】:Xamarin.Forms custom Android NavigationPageRenderer title and subtitleXamarin.Forms 自定义 Android NavigationPageRenderer 标题和副标题
【发布时间】:2016-07-22 15:28:05
【问题描述】:

目前正在做一个项目,我想使用 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

【问题讨论】:

    标签: xamarin xamarin.android xamarin.forms


    【解决方案1】:

    所以它看起来像 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() 中的引用仅设置字幕,因为字幕已经自动设置。

    Here's the complete renderer class :)

    【讨论】:

    • 感谢您的帮助 - 就像一个魅力!添加了一些编译器语句并使用指令使其在不运行 AppCompat 时工作。可用gist
    • 如何在特定的 Xamarin Forms 视图类上使用 CustomNavigation?
    猜你喜欢
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多