본문 바로가기

OS/Android

안드로이드 CustomView 생성자

반응형
public class CusView extends View
{
    static String TAG = CusView.class.getSimpleName();
    public CusView(Context context) { //코드상에서 부를때 호출된다.
        super(context);
        Log.d(TAG, "CusView(Context context) 호출");
    }

    public CusView(Context context, @Nullable AttributeSet attrs) { // XML에서 부를때 호출된다.
        //View가 Inflating될 때 3번째 생성자를 호출하는 것이 일반적임
        this(context, attrs, R.attr.editTextStyle);
        Log.d(TAG, "CusView(Context context, @Nullable AttributeSet attrs) 호출");
        // attrs 기본 속성들을 세팅할 때 사용한다.
    }

    public CusView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        Log.d(TAG, "CusView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) 호출");
    }

    public CusView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        Log.d(TAG, "CusView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) 호출");
    }

    // defStyleAttr : R.attr.XXX
    // defStyleRes : R.style.XXX
}

첫번째 생성자는 코드에서 뷰를 호출할 때 사용되는 생성자이고 두번째 생성자는 XML에서 호출할 때 사용된다. 

보통 기본 속성들을 세팅할 때 두번째 생성자에서 세번째 생성자를 호출하는 것이 일반적이다. (일반 SDK View들을 보면 보통 이런식)

※ attrs에 무슨 값이 들어오는 디버깅 해봤지만 Xml의 부모뷰 이름만 확인할 수 있었다.

4번째 생성자보면 defStyleAttr이랑 defStyleRes가 있는데 전자는 R.attr.XXX의 아이디 값을 의미하는거고 후자는 R.style.xxx을 의미한다.

 

반응형