13

我相当精通基于 ViewGroup 创建复杂的自定义布局。我唯一缺少的是创建自定义 LayoutParams 的能力。我真的需要获得利润的能力,为什么不创建其他额外的参数来传递给父级。

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

更新:

到目前为止,我坚持使用 FrameLayout 并覆盖 onMeasure 和 onLayout 函数来自己进行布局。这确实提供了 FrameLayout.LayoutParams。我猜孩子们必须支持自定义 LayoutParam?

4

1 回答 1

21

在您的自定义布局中,创建一个嵌套类扩展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) {

        }

    }

}

进一步说明:如何创建 FlowLayout(感谢Luksprog的链接!)

于 2012-08-15T17:26:19.730 回答