태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

 

안드로이드 앱을 만들면서 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 로드가 끝났을 때 해당 뷰의 상태 등을 로그로 출력할 수 있으므로, 초기화가 제대로 이루어졌는지 등을 이 메서드에서 확인하면 된다.