2016-10-06 11 views
7

AndroidのCardViewにレンダリングするContentViewとレンダラーを拡張するカスタムコンポーネントを作成しました。Android用のカスタムレンダラCardViewがFormsコンポーネントのコンテンツを表示しない

私が直面している問題は、FormsコンテンツがCardViewの下にレンダリングされることです。 KitKatではこれは起こらないが、私はCardViewの実装がLollipop以上と同じではないと思う。

CardViewの背景色を透明(0x00000000)に設定すると、CardViewの下のコンテンツが表示されます。

フォームコンポーネント:

using Xamarin.Forms; 

namespace CodeFest 
{ 
    public class NativeClientProfile : ContentView 
    { 
     public NativeClientProfile() 
     { 
      var grid = new Grid 
      { 
       RowDefinitions = new RowDefinitionCollection {new RowDefinition()}, 
       ColumnDefinitions = new ColumnDefinitionCollection {new ColumnDefinition(), new ColumnDefinition()} 
      }; 
      grid.Children.Add(new Label {Text = "FSP No"}, 0, 0); 
      grid.Children.Add(new Label {Text = "12345", HorizontalTextAlignment = TextAlignment.Center}, 1, 0); 
      grid.Children.Add(new Label {Text = "Risk"}, 0, 1); 
      grid.Children.Add(
       new Label {Text = "Low", TextColor = Color.Green, HorizontalTextAlignment = TextAlignment.Center}, 1, 1); 
      var item = new Label 
      { 
       Text = "Foo bar", 
       HorizontalTextAlignment = TextAlignment.Center, 
       FontSize = 30, 
       FontAttributes = FontAttributes.Bold 
      }; 
      Content = new StackLayout 
      { 
       Children = 
       { 
        item, 
        new Label 
        { 
         Text = "Financial Services Provider", 
         HorizontalTextAlignment = TextAlignment.Center 
        }, 
        grid 
       } 
      }; 
     } 
    } 
} 

カスタムレンダラ:

using Android.Support.V7.Widget; 
using Android.Text; 
using Android.Views; 
using CodeFest; 
using CodeFest.Droid.ComponentRenderers; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.Android; 

[assembly: ExportRenderer(typeof(NativeClientProfile), typeof(NativeClientProfileRenderer))] 
namespace CodeFest.Droid.ComponentRenderers 
{ 
    class NativeClientProfileRenderer : ViewRenderer<NativeClientProfile, CardView> 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<NativeClientProfile> elementChangedEventArgs) 
     { 
      var view = new CardView(Context); 
      //view.SetCardBackgroundColor(0x00000000); 
      SetNativeControl(view); 
     } 
    } 
} 

私が正しくCardViewカスタムレンダラ内のフォーム要素をレンダリングする方法の例を探しています。

+0

通常、CardViewはRecyclerViewで使用されます。 RecyclerViewの外で使用しますか?スタンドアローンビューの場合、なぜCardViewが必要なのですか? –

答えて

1

ContentViewではなく、Frameを基本クラスとして使用できます。これには、既存のFrameRendererXamarin.Forms.Platform.Android.AppCompatを既に使用しているCardViewを使用できるという利点があります。 (FrameRenderer.cs参照)。

FrameRenderer宣言

public class FrameRenderer : CardView, IVisualElementRenderer, AView.IOnClickListener, AView.IOnTouchListener 

レンダラ

class NativeClientProfileRenderer : Xamarin.Forms.Platform.Android.AppCompat.FrameRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<Frame> e) 
    { 
     base.OnElementChanged(e); 
    } 
} 

NativeClientProfile

public class NativeClientProfile : Frame 
{ 
    public NativeClientProfile() 
    { 
     // your stuff... 
     Content = new StackLayout 
     { 
      Children = 
      { 
       item, 
       new Label 
       { 
        Text = "Financial Services Provider", 
        HorizontalTextAlignment = TextAlignment.Center 
       }, 
       grid 
      } 
     }; 
    } 
} 

ディスカッション

レンダラはあなたが本当にそれを手動で行いたい場合は、それは必要なものを示しています。 FrameRendererを使用すると、コードはXamarinの実装に依存します。彼らがFrameのためにレンダリングされるビューのタイプを変更した場合、それはあなたのアプリケーションを壊します。しかし、FrameRendererの実装を見ていれば、最初から完全に作成することは避けてください(単純なリスク対努力の評価)。

関連する問題