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

前端之家收集整理的这篇文章主要介绍了Xamarin.Forms自定义Android NavigationPageRenderer标题和副标题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
目前正在开发一个我想使用AppCompat的项目,并且在大多数页面上都要求设置标题和副标题.

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

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

  1. using System.ComponentModel;
  2. using Android.App;
  3. using Android.Widget;
  4. using App1.Droid.Renderers;
  5. using Xamarin.Forms;
  6. using Xamarin.Forms.Platform.Android;
  7. #if __APPCOMPAT__
  8. using NavigationRenderer = Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer;
  9. #else
  10. using NavigationRenderer = Xamarin.Forms.Platform.Android.NavigationRenderer;
  11. #endif
  12.  
  13. [assembly: ExportRenderer(typeof(NavigationPage),typeof(NavigationPageRenderer))]
  14.  
  15. namespace App1.Droid.Renderers
  16. {
  17. public class NavigationPageRenderer : NavigationRenderer
  18. {
  19. protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
  20. {
  21. base.OnElementChanged(e);
  22. SetCustomView(e.NewElement.CurrentPage.GetType().Name);
  23. }
  24.  
  25. private void SetCustomView(string view)
  26. {
  27. var activity = (Activity)Context;
  28. #if __APPCOMPAT__
  29. var actionBar = ((FormsAppCompatActivity)Context).SupportActionBar;
  30. #else
  31. var actionBar = activity.ActionBar;
  32. #endif
  33. actionBar.Title = view;
  34. actionBar.Subtitle = " -> " + view;
  35. var abv = new LinearLayout(activity)
  36. {
  37. Orientation = Orientation.Vertical
  38. };
  39.  
  40. var main = new TextView(activity)
  41. {
  42. Text = view,};
  43. main.SetTextColor(Color.Aqua.ToAndroid());
  44. main.SetPadding(4,4,2,6);
  45. abv.AddView(main);
  46. abv.AddView(new TextView(activity)
  47. {
  48. Text = " -> " + view
  49. });
  50. actionBar.SetDisplayShowCustomEnabled(true);
  51. actionBar.CustomView = abv;
  52. }
  53.  
  54. protected override void OnElementPropertyChanged(object sender,PropertyChangedEventArgs e)
  55. {
  56. base.OnElementPropertyChanged(sender,e);
  57. if (e.PropertyName.Equals("CurrentPage"))
  58. {
  59. SetCustomView(((NavigationPage)sender).CurrentPage.GetType().Name);
  60. }
  61. }
  62. }
  63. }

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

解决方法

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

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

  1. public override void OnViewAdded(Android.Views.View child)
  2. {
  3. base.OnViewAdded(child);
  4.  
  5. if (child.GetType() == typeof(Support.Toolbar))
  6. toolbar = (Support.Toolbar)child;
  7. }

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

Here’s the complete renderer class

猜你在找的Android相关文章