好的,所以我正在尝试创建一些可重用的组件。基本上,我们有一个复合布局,包括:
- 标题
- 说明
- (任意数量的控制)
- 页脚
所以我有一个自定义的ViewGroup,它自动处理页眉和页脚的添加,以及文本和其他变量的自定义属性。
这一切都很好,但我正在尝试这样做,以便我可以在XML中指定控件视图(具有非常特定的布局),如下所示:
<com.mypackage.CustomLayout
///...
>
<com.mypackage.CustomControl
//attributes
/>
<com.mypackage.CustomControl2
//attributes
/>
<com.mypackage.CustomControl3
//attributes
/>
</com.mypackage.CustomLayout>
对于我的自定义控件,它们都遵循以下一般模式:
布局XML示例
<merge
android:layout_width="match_parent"
android:layout_height="100dp"
//Attributes
>
<OtherView/>
<OtherView/>
</merge>
对应的控制视图
public class ControlView extends LinearLayout {
public ControlView (Context context) {
super(context);
init();
}
public ControlView (Context context, AttributeSet attrs) {
super(context, attrs);
init();
parseAttributes(attrs);
}
public ControlView (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
parseAttributes(attrs);
}
private void init () {
LayoutInflater i = LayoutInflater.from(getContext());
i.inflate(R.layout.example_layout, this);
//Initialize subviews
}
}
问题是merge标签中的参数被忽略了,我需要为每个自定义控件添加layout_width
和layout_height
参数,而不是使用合并中定义的布局参数标签。
如果我尝试在init()
方法中设置LayoutParams,我仍然会收到运行时异常,说明需要layout_width
和layout_height
属性。
有没有更好的方法来做我正在做的事情?我想为自定义控件的任何实例提供预设LayoutParams
,无论XML中提供了哪些参数(如果有)。