Custom ViewGroup example
ViewGroup Example - FlowLayout
Slide & Sources
Example
예제를 하나 만들어 보자. 예제는 CalendarButton 이다. CalendarButton 은 attribute 로 view 를 받아서 그 view 를 inflate 하고 자신의 child 로 add 하는 view 이다.
CalendarButton 을 사용하는 방법은 아래와 같다.
CalendarButton 의 사용
<com.test.podlist.CalendarButton
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.test"
style="@style/CalendarFlatFrame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/calendar_flat_frame"
android:gravity="center"
android:id="@+id/calendar_frame"
app:top="@layout/calendar_flat_top"
app:body="@layout/calendar_flat_body"
>
</com.test.podlist.CalendarButton>
calendar_flat_top.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/calendar_top" style="@style/CalendarHead" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="10m 12d" android:gravity="bottom"/>
CalendarButton.java
CalendarButton 의 구현은 아래처럼 되어 있다.public class CalendarButton extends LinearLayout {
public CalendarButton(Context context) {
super(context);
init(context, null, 0);
}
public CalendarButton(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public CalendarButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
setTouchSlop(context);
if (attrs != null) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CalendarButton, defStyle, 0);
// inflation
final int N = typedArray.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = typedArray.getIndex(i);
int rid;
switch (attr) {
case R.styleable.CalendarButton_top:
rid = typedArray.getResourceId(attr, 0);
LayoutInflater.from(context).inflate(rid, this, true); // inflate and addView
break;
case R.styleable.CalendarButton_body:
rid = typedArray.getResourceId(attr, 0);
LayoutInflater.from(context).inflate(rid, this, true); // inflate and addView
break;
case R.styleable.CalendarButton_bottom:
rid = typedArray.getResourceId(attr, 0);
LayoutInflater.from(context).inflate(rid, this, true); // inflate and addView
break;
}
}
typedArray.recycle();
}
}
...
}
댓글 없음:
댓글 쓰기