[컴][안드로이드] ViewGroup 에서 child 에 속성 추가하기


ViewGroup 에서 child 에 속성 추가 하기, ViewGroup 의 child  attribute 추가, How to add the attributes of child in ViewGroup

 

참조 코드 : https://docs.google.com/file/d/0B_VKZCqEnHblNDdiY2UxODgtYWNhNS00MmU4LWE4NDMtZjQ1OWI5MDMxZTVh/edit?num=50&sort=name&layout=list#

 

viewgroup.addView(new TextView(this),
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT)
)

보통 addView() 는 위와 같이 사용한다.

inflate 할 때 addView 를 호출하기 전에 addView() 를 할 때 쓰일 LayoutParams 을 generateLayoutParams호출해서 만들게 된다. (코드: LayoutInflator.java)


그러면 당연히 child 의 개수만큼 generateLayoutParams호출 하게 되는데,


이 generateLayoutParams() 을 ViewGroup() 에서 override 해 주면, child 가 가지게 되는 LayoutParam(xml 에 있는 attribute 등)을 추가하거나 원하는 대로 설정할 수 있다.


아래 코드는 horizontalSpacing 과 breakLine 이라는 attribute 가 추가된 것이다.(   노란 색 박스 참고)


public class FlowLayout extends ViewGroup {
private int mHorizontalSpacing;
private int mVerticalSpacing;
private Paint mPaint;

public FlowLayout(Context context, AttributeSet attrs) {
super(context, attrs);

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlowLayout);
try {
mHorizontalSpacing = a.getDimensionPixelSize(R.styleable.FlowLayout_horizontalSpacing, 0);
mVerticalSpacing = a.getDimensionPixelSize(R.styleable.FlowLayout_verticalSpacing, 0);
} finally {
a.recycle();
}

mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(0xffff0000);
mPaint.setStrokeWidth(2.0f);
}

...

@Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
return p instanceof LayoutParams;
}

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

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

@Override
protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
return new LayoutParams(p.width, p.height);
}

public static class LayoutParams extends ViewGroup.LayoutParams {
int x;
int y;

public int horizontalSpacing;
public boolean breakLine;

public LayoutParams(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlowLayout_LayoutParams);
try {
horizontalSpacing = a.getDimensionPixelSize(R.styleable.FlowLayout_LayoutParams_layout_horizontalSpacing, -1);
breakLine = a.getBoolean(R.styleable.FlowLayout_LayoutParams_layout_breakLine, false);
} finally {
a.recycle();
}
}

public LayoutParams(int w, int h) {
super(w, h);
}
}
}

아래 같이 xml 에서 사용할 수 있다.

<?xml version="1.0" encoding="utf-8"?>
<com.example.android.layout.FlowLayout
xmlns:f="http://schemas.android.com/apk/res/com.example.android.layout"
xmlns:android="http://schemas.android.com/apk/res/android"
f:horizontalSpacing="6dip"
f:verticalSpacing="12dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="6dip"
android:paddingTop="6dip"
android:paddingRight="12dip">
<Button
android:layout_width="100dip"
android:layout_height="wrap_content"
android:text="OK" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
f:layout_horizontalSpacing="32dip"
android:text="Cancel" />
</com.example.android.layout.FlowLayout>

댓글 없음:

댓글 쓰기