2016-09-22 89 views
1

This doc解釋瞭如何爲Android,iOS等創建自定義PageRenderer。我嘗試按照文檔,但不知道爲什麼它不適用於Android。但它適用於iOS。Xamarin.Forms Android自定義ContentPage PageRenderer沒有渲染視圖

共享ContentPage類:

public class SecondPage : ContentPage 
    { 
     public SecondPage() 
     { 
      Content = new StackLayout 
      { 
       Children = { 
        new Label { Text = "Hello ContentPage" } 
       } 
      }; 
     } 
    } 

定製PageRenderer類安卓

[assembly: ExportRenderer(typeof(SecondPage), typeof(SecondPageRenderer))] 
namespace RenderFormsTest.Droid 
{ 
    public class SecondPageRenderer : PageRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Page> e) 
     { 
      base.OnElementChanged(e); 

      if (e.OldElement != null || Element == null) 
      { 
       return; 
      } 

      InitView(); 
     } 

     void InitView() 
     { 
      var context = Forms.Context; 
      string[] os = { "Android", "iOS", "Windows" }; 
      var ll = new LinearLayout(context); 
      ll.LayoutParameters = new LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent); 
      ll.SetBackgroundColor(Android.Graphics.Color.IndianRed); 

      var rg = new RadioGroup(context); 
      for (int index = 0; index < os.Length; index++) 
      { 
       rg.AddView(new RadioButton(context) { Text = os[index] }); 
      } 

      ll.AddView(rg); 

      AddView(ll); 
     } 
    } 
} 

能否請你告訴我哪裏出了問題?

+0

您能先告訴我們您期望發生什麼以及實際發生了什麼嗎? –

+0

** @GeraldVersluis **期望的結果是,當我導航到SeconPage時,應該顯示(呈現)具有三個單選按鈕的RadioGroup視圖。但目前我只能看到從ContentPage呈現的標籤,即「Hello ContentPage」,沒有任何其他視圖可見(或從平臺特定的自定義SecondPageRenderer類呈現) – user2618875

+0

在Android中,頁面呈現器只是一個視圖組,嘗試更改您的z-index自定義視圖,看看會發生什麼 – Bonelol

回答

2

我有類似的問題。看來佈局是不正確的。嘗試將其設置在PageRenderer.OnLayout中:

[assembly: ExportRenderer(typeof(SecondPage), typeof(SecondPageRenderer))] 
namespace RenderFormsTest.Droid 
{ 
    protected Android.Views.View NativeView; 

    public class SecondPageRenderer : PageRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Page> e) 
     { 
      base.OnElementChanged(e); 

      if (e.OldElement != null || Element == null) 
      { 
       if (Element == null) 
        NativeView = null; 

       return; 
      } 

      InitView(); 
     } 

     void InitView() 
     { 
      var context = Forms.Context; 
      string[] os = { "Android", "iOS", "Windows" }; 
      var ll = new LinearLayout(context); 
      ll.LayoutParameters = new LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent); 
      ll.SetBackgroundColor(Android.Graphics.Color.IndianRed); 

      var rg = new RadioGroup(context); 
      for (int index = 0; index < os.Length; index++) 
      { 
       rg.AddView(new RadioButton(context) { Text = os[index] });  
      } 

      ll.AddView(rg); 

      AddView(ll); 

      NativeView = ll; 
     } 

     protected override void OnLayout(bool changed, int l, int t, int r, int b) 
     { 
      base.OnLayout(changed, l, t, r, b); 

      if (NativeView != null) 
      { 
       var msw = MeasureSpec.MakeMeasureSpec(r - l, MeasureSpecMode.Exactly); 
       var msh = MeasureSpec.MakeMeasureSpec(b - t, MeasureSpecMode.Exactly); 

       NativeView.Measure(msw, msh); 
       NativeView.Layout(0, 0, r - l, b - t); 
      } 
     } 
    } 
} 
+0

** @ Florian **,你能解釋爲什麼需要重寫OnLayout嗎?文檔沒有提到任何關於它的信息(或者可能在其他配方中我不確定)。順便說一句OnLayout按預期完成工作。 – user2618875

+0

@ user2618875,我無法確定。我也希望它有這種行爲是默認的。我在許多樣品中發現了類似的處理。例如。 [博文(http://blog.masterdevs.com/xf-day-10/) – Florian