重写对应的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();
}
}
}