【问题标题】:How can I match my XML view with one created in code?如何将我的 XML 视图与在代码中创建的视图相匹配?
【发布时间】:2016-02-16 12:40:00
【问题描述】:

我正在尝试以编程方式创建一些视图,以匹配我在 XML 布局中制作的模型,但尽管看起来具有相同的属性,但它们的显示方式不同。

左边的卡片是使用下面的 XML 创建的,右边的卡片是使用代码创建的。正确的布局是左边那个,我的代码哪里错了?

XML(左图)

<LinearLayout
    android:layout_width="wrap_content"
    android:orientation="horizontal"
    android:id="@+id/cardViewContainer"
    android:layout_height="200dp">
    <android.support.v7.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/testCard">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:minHeight="200dp"
            android:minWidth="200dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TEST TITLE"
                android:layout_weight="1"
                android:layout_gravity="bottom"
                android:gravity="center"
                android:layout_margin="5px" />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

代码(右图)

var layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent);

int cardMinDims = (int)(200 * scale + 0.5f);

TextView title = new TextView(this);
title.Text = "TEST TITLE";
title.Gravity = GravityFlags.Center;
var title_layoutParams = layoutParams;
title_layoutParams.Weight = 1;
title_layoutParams.Gravity = GravityFlags.Bottom;
title_layoutParams.SetMargins(5, 5, 5, 5);

LinearLayout layout = new LinearLayout(this);
layout.SetMinimumHeight(cardMinDims);
layout.SetMinimumWidth(cardMinDims);
layout.Orientation = Orientation.Vertical;
layout.AddView(title,title_layoutParams);

CardView card = new CardView(this);
card.AddView(layout, layoutParams);

LinearLayout cardViewContainer = FindViewById<LinearLayout>(Resource.Id.cardViewContainer);
cardViewContainer.AddView(card,layoutParams);

【问题讨论】:

  • 添加布局重力和正常重力
  • 这就是我所做的,不是@Madhur吗? title.Gravity是设置常规重力,title_layoutParams.Gravity是设置布局重力?
  • layout.Orientation = Orientation.Vertical;到水平

标签: c# android xml xamarin


【解决方案1】:

在您的代码中,您重复使用您的LayoutParams:-

var layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent);

var title_layoutParams = layoutParams;

所以现在有一个来自title_layoutParams object 的引用指向layoutParams 的同一个对象引用。

您之后使用相同的layoutParams

由于这些是对象引用,您所做的任何更改都将应用于所有其他变量,因为它们指向相同的对象

我用代码重新创建了演示,下面的代码与您的axml 几乎相同,只是对layout_widthlayout_height 进行了一些调整,CardView 和内部@987654332 @ 使其按预期工作:-

我省略了以下演示中的任何缩放:-

示例:-

        LinearLayout objLinearLayout_CardViewContainer = new LinearLayout(this);
        objLinearLayout_CardViewContainer.Orientation = Orientation.Horizontal;
        objLinearLayout_CardViewContainer.LayoutParameters = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MatchParent, 400);

        Android.Support.V7.Widget.CardView objCardView = new CardView(this);
        objLinearLayout_CardViewContainer.AddView(objCardView, LinearLayout.LayoutParams.MatchParent, LinearLayout.LayoutParams.MatchParent);

        LinearLayout objCardViewLinearLayout = new LinearLayout(this);
        objCardViewLinearLayout.SetMinimumWidth(400);
        objCardViewLinearLayout.SetMinimumHeight(400);
        objCardView.AddView(objCardViewLinearLayout, CardView.LayoutParams.MatchParent, CardView.LayoutParams.MatchParent);

        TextView objTextView = new TextView(this);
        objTextView.Text = "TEST TITLE";
        objTextView.SetTextColor(Color.Red);
        objTextView.Gravity = GravityFlags.Center;

        LinearLayout.LayoutParams objLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WrapContent, LinearLayout.LayoutParams.WrapContent);
        objLayoutParams.Weight = 1;
        objLayoutParams.Gravity = GravityFlags.Bottom;
        objLayoutParams.SetMargins(5, 5, 5, 5);

        objCardViewLinearLayout.AddView(objTextView, objLayoutParams);

然后您将获得类似于以下内容的输出:-

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多