Derzeit arbeiten an einem Projekt, wo ich AppCompat verwenden und eine Anforderung Einstellung Titel und Untertitel auf den meisten Seiten haben.Xamarin.Forms benutzerdefinierte Android NavigationPageRenderer Titel und Untertitel
Es funktioniert nicht mit AppCompat überhaupt - weder die Eigenschaften festlegen noch eine benutzerdefinierte Ansicht verwenden.
Wenn AppCompat nicht verwendet wird, funktionieren beide wie erwartet. Der vollständige Quellcode ist verfügbar here so nur die App laufen, wenn Sie neugierig sind :)
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: Danke @jimmgarr. Der Code wurde geringfügig geändert, um zwischen AppCompbat und "Normalmodus" zu wechseln. Der Code ist verfügbar here
Danke für die Hilfe - wirkt wie ein Zauber! Einige Compiler-Anweisungen hinzugefügt und Direktiven verwendet, damit es funktioniert, wenn AppCompat nicht ausgeführt wird. Verfügbar als [gist] (https://gist.github.com/joacar/03b36c6fee955f7aed0a7b7b9e65225d) – joacar