2016-07-21 11 views
5

वर्तमान में एक ऐसे प्रोजेक्ट पर काम कर रहा है जहां मैं AppCompat का उपयोग करना चाहता हूं और अधिकांश पृष्ठों पर एक शीर्षक सेटिंग शीर्षक और उपशीर्षक रखना चाहता हूं।Xamarin.Forms कस्टम एंड्रॉइड नेविगेशन पेजरेंडर शीर्षक और उपशीर्षक

यह 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

तो यह नेविगेशन पेज 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

संबंधित मुद्दे