안드로이드 앱을 만들면서 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 로드가 끝났을 때 해당 뷰의 상태 등을 로그로 출력할 수 있으므로, 초기화가 제대로 이루어졌는지 등을 이 메서드에서 확인하면 된다.
'TechLog' 카테고리의 다른 글
Django 1.4 for Android (only dev. runserver!) (5) | 2012.07.27 |
---|---|
Mac OS X용 오디오 루프백 어댑터 - Soundflower (0) | 2012.07.26 |
iOS 카카오톡에서 무료통화(보이스톡) 기능 신청 버튼이 나타나지 않는 경우 (0) | 2012.06.13 |
MySQL의 데이터를 불러올 때 System.DateTime 변환 관련 오류 나는 경우 (0) | 2012.05.25 |
두 개의 bool 변수의 값을 맞바꾸는 방법 (3) | 2012.04.20 |