ViewGroup 에서 child 에 속성 추가 하기, ViewGroup 의 child attribute 추가, How to add the attributes of child in ViewGroup
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>
댓글 없음:
댓글 쓰기