将Xamarin Forms视图渲染为Android视图,而不指定大小

Ste*_*ary 17 android xamarin xamarin.forms

我使用的是原生Xamarin.Android RecyclerView 在我的XAML作为描述在这里.RecyclerView管理屏幕上每个项目的一个视图(仅在我的应用程序中显示为垂直列表).如果我使用Xamarin.Android视图作为项目视图(在此示例中,a TextView),这可以正常工作:

public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
  var view = new TextView(parent.Context);
  return new TestViewHolder(view);
}
Run Code Online (Sandbox Code Playgroud)

但是,我真正想要做的是定义一个Xamarin.Forms控件并RecyclerView使用它.我可以使用内置的Android渲染器来获取Android视图,并且可以正常工作(即显示正确的数据):

public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
    var label = new Label { Text = "Hello!" };
    var cv = new ContentView
    {
        VerticalOptions = LayoutOptions.Start,
        HorizontalOptions = LayoutOptions.Start,
        Content = label,
    };
    var renderer = Xamarin.Forms.Platform.Android.Platform.CreateRendererWithContext(cv, parent.Context);
    var view = renderer.View;
    renderer.Tracker.UpdateLayout();
    view.LayoutParameters = new RecyclerView.LayoutParams(parent.Width, parent.Height);
    cv.Layout(Rectangle.FromLTRB(0, 0, parent.Width, parent.Height));
    view.Layout(0, 0, (int)cv.Width, (int)cv.Height);

    return new TestViewHolder(label, view);
}
Run Code Online (Sandbox Code Playgroud)

然而,由此产生的Android观点总是有它的高度和宽度设置为任意大小我通过,即使我用的水平/垂直选项Start无处不在.我想要的是Android视图只占用它所需的空间(至少是垂直的;它可以自由地水平扩展).

类似的问题,没有任何答案:如何在Xamarin.Android和Xamarin.iOS中添加Xamarin Forms内容作为子视图

Rob*_*bit 3

您可以使用本机 UI 控件。

TextView代替LabelLinearLayout或其他ViewGroup代替ContentView

这些 Native UI 控件可以实现相同的目标,只需更改TestViewHolder类和OnCreateViewHolder方法,如下所示:

TestViewHolder

public class TestViewHolder : RecyclerView.ViewHolder
{

    public TextView Label { get; }

    public TestViewHolder(TextView label, Android.Views.View view) : base(view)
    {
        Label = label;

    }
}
Run Code Online (Sandbox Code Playgroud)

OnCreateViewHolder

public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
    TextView tv = new TextView(parent.Context);
    tv.SetTextColor(Android.Graphics.Color.Black);
    tv.SetTextSize(Android.Util.ComplexUnitType.Dip,5.0f);
    tv.SetBackgroundColor(Android.Graphics.Color.Red);
    LinearLayout ll = new LinearLayout(parent.Context);
    ll.LayoutParameters=new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MatchParent, RecyclerView.LayoutParams.WrapContent);
    ll.SetBackgroundColor(Android.Graphics.Color.Green);
    ll.AddView(tv);

    return new TestViewHolder(tv,ll);
}
Run Code Online (Sandbox Code Playgroud)