2016-07-21 27 views
5

Şu anda AppCompat kullanmak istediğim ve sayfaların çoğunda başlık ve altyazı ayarlama gereksinimi olan bir proje üzerinde çalışıyor.Xamarin.Forms özel Android NavigationPageRenderer başlığı ve altyazı

Hiçbiri AppCompat kullanarak çalışmıyor - özellikleri ayarlama veya özel görünüm kullanma.

AppCompat kullanmıyorken her ikisi de beklendiği gibi çalışır. Teşekkür @jimmgarr: Tam kaynak kodu meraklı :)

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

Düzenleme iseniz here yüzden sadece uygulamanın çalışma mevcuttur. AppCompbat ve "normal mod" arasında geçiş yapmak için kodu biraz değiştirdi. Kod kullanılabilir here

cevap

6

Bu nedenle NavigationPage uses its own Toolbar instance gibi görünüyor. Bu nedenle SupportActionBar'daki özelliklerin ayarlanması bir şey yapmıyor. Eklenen ayarı

Yeni Araç Çubuğu bir başvuru almak için OnViewAdded() geçersiz kılarak çalışma elde edebildi:

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

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

Başlık zaten ayarlanmış olduğundan Sonra sadece Altyazı ayarlamak için SetCustomView() iç referans kullanarak otomatik olarak.

Here's the complete renderer class :) yardım için

+0

Teşekkür - bir cazibe gibi çalışır! AppCompat çalıştırmıyorken çalışmasını sağlamak için bazı derleyici ifadeleri ve yönergeleri kullanma. [Gist] olarak kullanılabilir (https://gist.github.com/joacar/03b36c6fee955f7aed0a7b7b9e65225d) – joacar