在运行时在代码中设置布局属性

时间:2011-04-27 13:35:28

标签: xamarin.android

我无法找到如何在代码中设置布局属性。 我的控件是在运行时生成的,因此我无法在xml中设置布局。

我希望能够设置

等属性

机器人:layout_alignParentBottom = “真” 机器人:layout_alignParentRight = “真” 机器人:layout_weight = “1”

但是我找不到任何关于如何在代码中执行此操作的文档或示例。 是否可以使用当前版本的Mono for Android?

1 个答案:

答案 0 :(得分:10)

Relevant thread on the Mono for Android mailing list.

许多构造函数采用IAttributeSet实例,因此(最坏的情况),在调用例如{0}}时,您始终可以通过该参数提供XML自定义属性。 RelativeLayout(Context, IAttributeSet) constructor

资源属性在Java代码中专门处理,因此可能因类而异。例如,RelativeLayout constructor implementation

因此,属性可以(并且将)特定于给定类型。例如,尽管我可以快速浏览Android源代码,但对于同时具有android:layout_alignParentBottomandroid:layout_weight属性的类型无效,因为android:layout_alignParentBottom似乎特定于RelativeLayout类型,而android:layout_weight特定于LinearLayoutRelativeLayoutLinearLayout之间没有继承关系。

也就是说,要以编程方式分配android:layout_alignParentBottom属性,看起来你想要这样做:

// Get a RelativeLayout.LayoutParams instance
// Option 1, if you have an existing RelativeLayout instance already:
var p = (RelativeLayout.LayoutParams) layout.LayoutParameters;

// Option 2: if you don't.
var p = new RelativeLayout.LayoutParams (context, null);

// Enable layout_alignParentBottom:
p.AddRule ((int) LayoutRules.AlignParentBottom);

这使用RelativeLayout.LayoutParams.AddRule方法启用布局选项。 int强制转换是必要的,因为我们没有意识到AddRule()应该使用LayoutRules枚举;糟糕。

以编程方式分配android:layout_alignParentRight属性:

p.AddRule ((int) LayoutRules.AlignParentRight);

如上所述,android:layout_weight似乎特定于LinearLayout,因此我们无法使用RelativeLayout.LayoutParams来设置此项。相反,我们需要使用LinearLayout.LayoutParams来设置LinearLayout.LayoutParams.Weight属性:

// Just like before, but get a LinearLayout.LayoutParams instance
// Option 1, if you have an existing LinearLayout instance already:
var p = (LinearLayout.LayoutParams) layout.LayoutParameters;

// Option 2: if you don't.
var p = new LinearLayout.LayoutParams (context, null);

// Enable layout_weight:
p.Weight = 1.0f;