如何创建要在自定义布局上使用的自定义LayoutParams?

时间:2012-08-15 13:56:58

标签: android android-layout

我非常擅长基于ViewGroup创建复杂的自定义布局。我唯一缺少的是能够创建自定义LayoutParams。我真的需要能够获得边距,为什么不创建其他额外的参数传递给父母。

如何创建自定义LayoutParam并通过xml使用它?我尝试使用LinearLayout.LayoutParam,但它显然崩溃,因为父级不是LinearLayout。如何在自定义布局上使用LayoutParams?

更新

截至目前,我一直坚持使用FrameLayout并重写onMeasure和onLayout函数来自行完成布局。这确实提供了FrameLayout.LayoutParams。我猜测孩子们必须支持自定义LayoutParam?

1 个答案:

答案 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!)