viewgroup如何感知view的LayoutParams

来源:互联网 发布:淘宝助理导入不了csv 编辑:程序博客网 时间:2024/06/05 06:19

首先在自定义viewgroup中,我们重新定义了ViewGroup.LayoutParams,重写了参数获取函数以及addView函数,代码参考了安卓源代码中的ViewPager.java

    public static class LayoutParams extends ViewGroup.LayoutParams {

        public boolean isDecor;
        public int gravity;
        int position;

        public LayoutParams() {
            super(FILL_PARENT, FILL_PARENT);
        }

        public LayoutParams(Context context, AttributeSet attrs) {
            super(context, attrs);
            final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
            gravity = a.getInteger(0, Gravity.Bottom);
            a.recycle();
        }
    }


    @Override
    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
        return new LayoutParams();
    }

    @Override
    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
        return generateDefaultLayoutParams();
    }

    @Override
    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new LayoutParams(getContext(), attrs);
    }


    public void addView(View child, int index) {
        if (child == null) {
            throw new IllegalArgumentException("Cannot add a null child view to a ViewGroup");
        }
        LayoutParams params = child.getLayoutParams();
        if (params == null) {
            params = generateDefaultLayoutParams();
            if (params == null) {
                throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null");
            }
        }
        addView(child, index, params);
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        if (!checkLayoutParams(params)) {
            params = generateLayoutParams(params);
        }
        final LayoutParams lp = (LayoutParams) params;
        lp.isDecor |= child instanceof Decor;

        super.addView(child, index, params);
    }
在addView(View child,int index)方法中,首先会获取子视图的参数信息,如果子视图的参数为空,则调用viewgroup的generateDefaultLayoutParams方法为子视图生成默认的参数信息,另外,在重写的addView(View child,int index,ViewGroup.LayoutParams params)中,我们还可以对子类传递到viewGroup中的param信息进行适当修改。

0 0
原创粉丝点击