2016-07-21 12 views
5

現在、私はAppCompatを使用し、ほとんどのページでタイトルとサブタイトルを設定する必要があるプロジェクトで作業しています。Xamarin.FormsカスタムAndroid NavigationPageRendererタイトルとサブタイトル

AppCompatを使用しても、プロパティの設定やカスタムビューの使用はまったく機能しません。

AppCompatを使用しない場合は、両方とも期待どおりに動作します。おかげで@jimmgarr:完全なソースコードは、あなたが興味があればこれだけのアプリを実行します:)

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

を編集here可能です。 AppCompbatと "ノーマルモード"を交互に変更するようにコードを少し変更しました。コードは利用可能ですhere

答えて

6

したがって、NavigationPage uses its own Toolbar instanceのように見えます。そのため、SupportActionBarのプロパティを設定することは何もしません。

私は、それが追加されますときに新しいツールバーへの参照を取得するためにOnViewAdded()をオーバーライドして動作させることができました。タイトルがすでに設定されているだけなので字幕を設定するSetCustomView()内の参照を使用して

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

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

その後自動的に。

Here's the complete renderer class :)助けを

+0

おかげで - 魔法のように動作します! AppCompatを実行していないときに動作させるためのコンパイラ文とディレクティブを追加しました。 [gist]として利用可能(https://gist.github.com/joacar/03b36c6fee955f7aed0a7b7b9e65225d) – joacar

関連する問題