2016-07-21 11 views
5

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

Antwort

6

So sieht es aus wie die NavigationPage uses its own Toolbar instance. Aus diesem Grund werden die Eigenschaften von SupportActionBar nicht geändert.

Ich konnte es durch OnViewAdded() Arbeit bekommen zwingenden einen Verweis auf die neue Symbolleiste zu erhalten, wenn es hinzugefügt wird:

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

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

dann die Referenz innerhalb SetCustomView() nur mit dem Untertitel einstellen, da der Titel bereits gesetzt ist automatisch.

Here's the complete renderer class :)

+0

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