android 获取xml布局中View带有大小的属性值

重写对应的ViewGroup中的generateLayoutParams() 方法,以下是RelativeLayout布局中的为例

1.布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FitRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_face"
        android:layout_width="200px"
        android:layout_height="67px"
        android:layout_centerVertical="true"
        android:text="信息"
        android:textSize="16px"
        android:paddingBottom="20px"
        android:layout_marginTop="40px"/>

</FitRelativeLayout>

2.属性bean对象

public class LayoutInfo {
    private int text_size;
    private int padding;
    private int padding_left;
    private int padding_top;
    private int padding_right;
    private int padding_bottom;
    private int width;
    private int height;
    private int margin;
    private int margin_left;
    private int margin_top;
    private int margin_right;
    private int margin_bottom;
    private int max_width;
    private int max_height;
    private int min_width;
    private int min_height;

    public int getText_size() {
        return text_size;
    }

    public void setText_size(int text_size) {
        this.text_size = text_size;
    }

    public int getPadding() {
        return padding;
    }

    public void setPadding(int padding) {
        this.padding = padding;
    }

    public int getPadding_left() {
        return padding_left;
    }

    public void setPadding_left(int padding_left) {
        this.padding_left = padding_left;
    }

    public int getPadding_top() {
        return padding_top;
    }

    public void setPadding_top(int padding_top) {
        this.padding_top = padding_top;
    }

    public int getPadding_right() {
        return padding_right;
    }

    public void setPadding_right(int padding_right) {
        this.padding_right = padding_right;
    }

    public int getPadding_bottom() {
        return padding_bottom;
    }

    public void setPadding_bottom(int padding_bottom) {
        this.padding_bottom = padding_bottom;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getMargin() {
        return margin;
    }

    public void setMargin(int margin) {
        this.margin = margin;
    }

    public int getMargin_left() {
        return margin_left;
    }

    public void setMargin_left(int margin_left) {
        this.margin_left = margin_left;
    }

    public int getMargin_top() {
        return margin_top;
    }

    public void setMargin_top(int margin_top) {
        this.margin_top = margin_top;
    }

    public int getMargin_right() {
        return margin_right;
    }

    public void setMargin_right(int margin_right) {
        this.margin_right = margin_right;
    }

    public int getMargin_bottom() {
        return margin_bottom;
    }

    public void setMargin_bottom(int margin_bottom) {
        this.margin_bottom = margin_bottom;
    }

    public int getMax_width() {
        return max_width;
    }

    public void setMax_width(int max_width) {
        this.max_width = max_width;
    }

    public int getMax_height() {
        return max_height;
    }

    public void setMax_height(int max_height) {
        this.max_height = max_height;
    }

    public int getMin_width() {
        return min_width;
    }

    public void setMin_width(int min_width) {
        this.min_width = min_width;
    }

    public int getMin_height() {
        return min_height;
    }

    public void setMin_height(int min_height) {
        this.min_height = min_height;
    }

    @Override
    public String toString() {
        return "LayoutInfo{" +
                "text_size=" + text_size +
                ", padding=" + padding +
                ", padding_left=" + padding_left +
                ", padding_top=" + padding_top +
                ", padding_right=" + padding_right +
                ", padding_bottom=" + padding_bottom +
                ", width=" + width +
                ", height=" + height +
                ", margin=" + margin +
                ", margin_left=" + margin_left +
                ", margin_top=" + margin_top +
                ", margin_right=" + margin_right +
                ", margin_bottom=" + margin_bottom +
                ", max_width=" + max_width +
                ", max_height=" + max_height +
                ", min_width=" + min_width +
                ", min_height=" + min_height +
                '}';
    }
}

3.实现自定义的FitRelativeLayout

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.RelativeLayout;

public class FitRelativeLayout extends RelativeLayout {
    private MyLayoutParams myLayoutParams;

    public FitRelativeLayout(Context context) {
        super(context);
    }

    public FitRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FitRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public LayoutParams generateLayoutParams(AttributeSet attributeSet) {
        if (myLayoutParams == null) {
            myLayoutParams = new MyLayoutParams(getContext(), attributeSet);
        }
        return myLayoutParams;
    }


    public static class MyLayoutParams extends RelativeLayout.LayoutParams {

        private LayoutInfo layoutInfo;

        public MyLayoutParams(Context c, AttributeSet attrs) {
            super(c, attrs);

            //这里 宽和高获取到的是0
            layoutInfo = new LayoutInfo();
            getLayoutInfo(c, attrs);
        }


        private final int[] LL = new int[]{
                android.R.attr.textSize,
                android.R.attr.padding,//
                android.R.attr.paddingLeft,//
                android.R.attr.paddingTop,//
                android.R.attr.paddingRight,//
                android.R.attr.paddingBottom,//
                android.R.attr.layout_width,//
                android.R.attr.layout_height,//
                android.R.attr.layout_margin,//
                android.R.attr.layout_marginLeft,//
                android.R.attr.layout_marginTop,//
                android.R.attr.layout_marginRight,//
                android.R.attr.layout_marginBottom,//
                android.R.attr.maxWidth,//
                android.R.attr.maxHeight,//
                android.R.attr.minWidth,//
                android.R.attr.minHeight,//16843072
        };

        private static final int INDEX_TEXT_SIZE = 0;
        private static final int INDEX_PADDING = 1;
        private static final int INDEX_PADDING_LEFT = 2;
        private static final int INDEX_PADDING_TOP = 3;
        private static final int INDEX_PADDING_RIGHT = 4;
        private static final int INDEX_PADDING_BOTTOM = 5;
        private static final int INDEX_WIDTH = 6;
        private static final int INDEX_HEIGHT = 7;
        private static final int INDEX_MARGIN = 8;
        private static final int INDEX_MARGIN_LEFT = 9;
        private static final int INDEX_MARGIN_TOP = 10;
        private static final int INDEX_MARGIN_RIGHT = 11;
        private static final int INDEX_MARGIN_BOTTOM = 12;
        private static final int INDEX_MAX_WIDTH = 13;
        private static final int INDEX_MAX_HEIGHT = 14;
        private static final int INDEX_MIN_WIDTH = 15;
        private static final int INDEX_MIN_HEIGHT = 16;


        private void getLayoutInfo(Context c, AttributeSet attrs) {
            TypedArray array = c.obtainStyledAttributes(attrs, LL);
            int n = array.getIndexCount();
            for (int i = 0; i < n; i++) {
                int index = array.getIndex(i);
                int pxVal = 0;
                String val = "";
                try {
                    pxVal = array.getDimensionPixelOffset(index, 0);
                    val = array.getString(index);
                    //Log.i("获取属性大小的值:", "带有单位的:" + val + " ---->  px的值:" + pxVal);
                } catch (Exception e)//not dimension
                {
                    e.printStackTrace();
                }

                switch (index) {
                    case INDEX_TEXT_SIZE:
                        layoutInfo.setText_size(pxVal);
                        break;
                    case INDEX_PADDING:
                        layoutInfo.setPadding(pxVal);
                        break;
                    case INDEX_PADDING_LEFT:
                        layoutInfo.setPadding_left(pxVal);
                        break;
                    case INDEX_PADDING_TOP:
                        layoutInfo.setPadding_top(pxVal);
                        break;
                    case INDEX_PADDING_RIGHT:
                        layoutInfo.setPadding_right(pxVal);
                        break;
                    case INDEX_PADDING_BOTTOM:
                        layoutInfo.setPadding_bottom(pxVal);
                        break;
                    case INDEX_WIDTH:
                        layoutInfo.setWidth(pxVal);
                        break;
                    case INDEX_HEIGHT:
                        layoutInfo.setHeight(pxVal);
                        break;
                    case INDEX_MARGIN:
                        layoutInfo.setMargin(pxVal);
                        break;
                    case INDEX_MARGIN_LEFT:
                        layoutInfo.setMargin_left(pxVal);
                        break;
                    case INDEX_MARGIN_TOP:
                        layoutInfo.setMargin_top(pxVal);
                        break;
                    case INDEX_MARGIN_RIGHT:
                        layoutInfo.setMargin_right(pxVal);
                        break;
                    case INDEX_MARGIN_BOTTOM:
                        layoutInfo.setMargin_bottom(pxVal);
                        break;
                    case INDEX_MAX_WIDTH:
                        layoutInfo.setMax_width(pxVal);
                        break;
                    case INDEX_MAX_HEIGHT:
                        layoutInfo.setMax_height(pxVal);
                        break;
                    case INDEX_MIN_WIDTH:
                        layoutInfo.setMin_width(pxVal);
                        break;
                    case INDEX_MIN_HEIGHT:
                        layoutInfo.setMin_height(pxVal);
                        break;
                }
            }
            Log.i("获取到的值:", layoutInfo.toString());
            array.recycle();
        }

    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值