我非常擅长基于ViewGroup创建复杂的自定义布局。我唯一缺少的是能够创建自定义LayoutParams。我真的需要能够获得边距,为什么不创建其他额外的参数传递给父母。
如何创建自定义LayoutParam并通过xml使用它?我尝试使用LinearLayout.LayoutParam,但它显然崩溃,因为父级不是LinearLayout。如何在自定义布局上使用LayoutParams?
更新
截至目前,我一直坚持使用FrameLayout并重写onMeasure和onLayout函数来自行完成布局。这确实提供了FrameLayout.LayoutParams。我猜测孩子们必须支持自定义LayoutParam?
答案 0 :(得分:19)
在自定义布局中,创建一个扩展ViewGroup.LayoutParams
的嵌套类。然后覆盖一些方法(在我的例子中所有必需的方法)。这是我的一个自定义布局的简化版本:
public class MyLayout extends ViewGroup {
public MyLayout(Context context) {
}
public MyLayout(Context context, AttributeSet attrs) {
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
}
@Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
return p instanceof LayoutParams;
}
@Override
protected LayoutParams generateDefaultLayoutParams() {
return new LayoutParams();
}
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new LayoutParams(getContext(), attrs);
}
@Override
protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
return generateDefaultLayoutParams(); // TODO Change this?
}
public static class LayoutParams extends ViewGroup.LayoutParams {
public LayoutParams() {
}
public LayoutParams(int width, int height) {
}
public LayoutParams(Context context, AttributeSet attrs) {
}
}
}
进一步说明:How to create a FlowLayout(感谢链接Luksprog!)