2016-07-21 20 views
5

Hiện đang làm việc trên một dự án mà tôi muốn sử dụng AppCompat và có yêu cầu đặt tiêu đề và phụ đề trên hầu hết các trang.Xamarin.Forms tùy chỉnh Android NavigationPageRenderer tiêu đề và phụ đề

Nó không hoạt động bằng cách sử dụng AppCompat cả - không cài đặt thuộc tính cũng như sử dụng chế độ xem tùy chỉnh.

Khi không sử dụng AppCompat, cả hai hoạt động như mong đợi. Mã nguồn đầy đủ có sẵn here vì vậy chỉ cần chạy ứng dụng nếu bạn tò mò :)

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); 
      } 
     } 
    } 
} 

Edit: Thanks @jimmgarr. Thay đổi mã một chút để giữ xen kẽ giữa AppCompbat và "chế độ bình thường". Mã này có sẵn here

Trả lời

6

Vì vậy, có vẻ như NavigationPage uses its own Toolbar instance. Đó là lý do tại sao thiết lập các thuộc tính trên SupportActionBar không làm gì cả.

tôi đã có thể để có được nó làm việc bằng cách ghi đè OnViewAdded() để có được một tài liệu tham khảo cho Thanh công cụ mới khi nó được thêm vào:

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

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

Sau đó, sử dụng tài liệu tham khảo bên SetCustomView() để thiết lập chỉ có phụ đề từ các đề đã được thiết lập tự động.

Here's the complete renderer class :)

+0

Cảm ơn sự trợ giúp - hoạt động như sự quyến rũ! Đã thêm một số câu lệnh trình biên dịch và sử dụng các chỉ thị để làm cho nó hoạt động khi không chạy AppCompat. Có sẵn dưới dạng [gist] (https://gist.github.com/joacar/03b36c6fee955f7aed0a7b7b9e65225d) – joacar

Các vấn đề liên quan