android - 将 Xamarin Forms View 呈现为 Android View 而不指定大小

标签 android xamarin xamarin.forms

我使用的是原生 Xamarin.Android RecyclerView in my XAML如所述here . RecyclerView 管理屏幕上每个项目的一个 View (仅在我的应用程序中显示为垂直列表)。这工作正常if I use a Xamarin.Android view as the item view (in this example, a TextView) :

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

不过,我真正想做的是定义一个 Xamarin.Forms 控件并让 RecyclerView 使用它。我可以use a built-in Android renderer to get an Android view ,并且有效(即显示正确的数据):

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);
}

但是,生成的 Android View 始终将其高度和宽度设置为我传入的任何大小,即使我在任何地方都使用 Start 的水平/垂直选项。我想要的是 Android View 只占用它需要的空间(至少垂直;它可以自由水平扩展)。

类似的问题,没有任何答案:How to add Xamarin Forms content as a subview in Xamarin.Android and Xamarin.iOS

最佳答案

您可以使用 native 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;

    }
}

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);
}

关于android - 将 Xamarin Forms View 呈现为 Android View 而不指定大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48843547/

相关文章:

android - 检查用户是否存在于 Firestore 中

java - 设置 Activity 中的 if()

android - 使用 Xamarin 将 Android SDK 移动到另一个文件夹

c# - Xamarin Android - VpnService 阻止所有应用程序

mobile - Xamarin.Forms : Does anyone know what's the equivalent of WillEnterForeground and DidEnterBackground in Xamarin. 表单?

java - 相关实体的 GreenDao getter 返回空列表

javascript - Cordova : How to enable viewport zoom

c# - StackLayout内的ListView : How to auto resize the ListView?

c# - 如何将四元数转换为角度?

xamarin - 如何从使用 Android 应用程序部署的本地文件中解码位图