[컴][안드로이드] 커스텀 뷰그룹 Custom ViewGroup 만들기


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();
        }


    }
...

}




Reference

  1. http://stackoverflow.com/questions/5663068/custom-viewgroup-example-please

댓글 없음:

댓글 쓰기