2016-07-21 4 views
5

В настоящее время работает над проектом, в котором я хочу использовать AppCompat, и на большинстве страниц есть заголовок требования и субтитры.Xamarin.Forms custom Android NavigationPageRenderer название и подзаголовок

Он вообще не работает с использованием AppCompat - ни настройка свойств, ни пользовательский вид.

Когда использование AppCompat не работает, как ожидается. Полный исходный код доступен here так просто запустить приложение, если вам интересно :)

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: Спасибо @jimmgarr. Немного изменил код, чтобы чередование между AppCompbat и «обычным режимом». Код доступен here

ответ

6

Так что это похоже на NavigationPage uses its own Toolbar instance. Вот почему настройка свойств на SupportActionBar не делает ничего.

я смог получить его работу путем переопределения OnViewAdded(), чтобы получить ссылку на новую панель инструментов, когда он добавил:

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

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

Затем с помощью ссылки внутри SetCustomView() установить только субтитры, так как название уже установлен автоматически.

Here's the complete renderer class :)

+0

Спасибо за помощь - работает как шарм! Добавлены некоторые операторы компилятора и с помощью директив, чтобы они работали при запуске AppCompat. Доступно как [gist] (https://gist.github.com/joacar/03b36c6fee955f7aed0a7b7b9e65225d) – joacar

Смежные вопросы