본문 바로가기

TechLog

Activity 레이아웃 xml 파일을 편집할 경우, custom view가 제대로 표시되지 않는 문제

안드로이드 앱을 만들면서 View 클래스를 직접 만들어 액티비티에 추가했을 경우, 이클립스의 레이아웃 편집기에서 액티비티의 레이아웃 XML 파일을 편집하려고 할 때 오류 혹은 경고가 마구 발생하는 상황을 겪어본 적이 있을 것이다. (만약 겪지 않았다면 ... 레퍼런스를 잘 읽으셨군요!)




커스텀 뷰의 레이아웃을 눈으로 확인해야 할 경우에는 이런 에러가 발생하면 레이아웃이 제대로 표시되지 않으므로 상당히 번거로워지는데 ... 에러가 발생하는 경우는 상당히 다양해서 처리하기도 애매한 경우가 많다. 몇 가지 팁을 적어보자면:




- View 클래스의 생성자를 모두 구현한다

public GlowView(Context context) {
	super(context);
}
public GlowView(Context context, AttributeSet attrs) {
	super(context, attrs);
}
public GlowView(Context context, AttributeSet attrs, int defStyle) {
	super(context, attrs, defStyle);
}


위 코드는 케냘이 구현한 프로그램의 커스텀 뷰 클래스의 생성자이다. 별 생각 없이 Context 타입 인수를 받는 생성자 메서드만 구현하는 경우가 있는데, 이렇게 구현했을 경우 XML에서 지정된 속성이 제대로 표시되지 않게 된다.




- isInEditMode() 메서드를 적절히 사용한다


@Override
protected void onDraw(Canvas canvas) {
	if(isInEditMode()) return;
	super.onDraw(canvas);
	this.drawRect();
}


액티비티의 XML이 레이아웃 편집기에 표시될 때(다시 말해, 이클립스에서 액티비티 XML를 편집할 때), isInEditMode() 메서드를 사용하면 현재 커스텀 뷰를 instantiate하는 주체가 실제 프로그램인지, 아니면 이클립스의 레이아웃 편집기인지를 알아낼 수 있다(isInEditMode() 메서드가 true를 반환할 경우에는 이클립스에서 이 액티비티 XML을 편집하고 있는 것이다).


케냘의 경우에는 XML 레이아웃 편집기에서 화면에 표시할 별다른 내용이 없으므로 강제로 return하고 있는데, 필요하다면 여기에 샘플 이미지 등을 출력하여 이클립스에서 확인하는 용도로 사용할 수 있다.




- onFinishInflate() 메서드를 활용하자


앱이 실행될 때 액티비티의 XML 파일을 읽어들여 커스텀 뷰의 인스턴스를 생성하는 것처럼, 이클립스의 XML 레이아웃 편집기도 마찬가지로 액티비티의 XML 파일을 읽어들인다. onFinishInflate() 메서드를 사용하면 실제 XML 로드가 끝났을 때 해당 뷰의 상태 등을 로그로 출력할 수 있으므로, 초기화가 제대로 이루어졌는지 등을 이 메서드에서 확인하면 된다.