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

Jon*_*ona 13 android android-layout

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

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

更新:

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

Joe*_*ren 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) {

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

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