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
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