2016-07-21 3 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()를 재정 의하여 작업을 얻을 수있었습니다 :

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