目前正在开发一个我想使用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); } } } }
解决方法
所以它看起来像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已经自动设置.