블로그 이미지
Kanais
Researcher & Developer 퍼즐을 완성하려면 퍼즐 조각들을 하나 둘씩 맞춰나가야 한다. 인생의 퍼즐 조각들을 하나 둘씩 맞춰나가다 보면 인생이란 퍼즐도 완성되는 날이 오려나...?

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

05-07 06:41

Recent Post

Recent Comment

Recent Trackback

Archive

2015. 10. 21. 16:21 Programming/Android

작성날짜 : 2011-10-04


출처 : sail2 tistory - Android Custom View의 생성시 주의사항


Android에서 UI개발을 하다보면, 기존에 제공되는 Widget 들을 상속받아 Customizing을 해야 하는 경우가 아주 많다.

때로는 단순히 상속을 받아 처리해야 하는 경우도 많은데,

안드로이드에서 제공하는 예제에서도 설명이 잘 되어있지만 custom view를 만들 때 유의사항을 정리한다.

 

view를 상속받아 구현하는 경우,

1
2
3
public class LogoImageView extends ImageView{
.....
}

위처럼 ImageView (View든 상관없음)를 상속 받아 구현을 하였고 이 View를 xml layout 상에 배치하려고 한다면

layout.xml 파일에 아래와 같이 작성해야 한다.

 

1
2
<com.xxxx.xxxx.logoimageview android:layout_width="fill_parent" android:layout_height="wrap_content"><br>
</com.xxxx.xxxx.logoimageview>

여기서 주의 할점은 android:layout_width 와 같은 layout에 관한 Attribute를 XML에서 설정하였기 때문에

LogoImageView는 반드시 생성자에서 AttributeSet을 받아야 한다.

 

생성자에대해서 알아본다면,

1. 기본형 생성자
 

1
public LogoImageView(Context context)

2. style이나 layout을 지정한 생성자

1
2
public LogoImageView(Context context, AttributeSet attrs)
public LogoImageView(Context context, AttributeSet attrs, int defStyle)

만일 위 코드에서 1번 기본형 생성자를 사용하게 되면 compile에는 문제가 없으나

Runtime에서 layout inflate시에 죽는 문제가 발생한다.

 

또 하나 유의할 점은 View의 생성 시점이다.

 

위 LogoImageView를 사용하기 위해선 instance를 가져와야 하는데,

XML상에 <com.xxxx.xxxx.xxxx.LogoImageView> 로 배치하였다면

 

main Activity에 setContentView(R.layout.main) 을 하는 순간 인스턴스가 생성된다.

따라서 아래와 같이 일반적으로 xml에 배치한 View를 사용하는 방법과 동일하게 진행하면 된다.

1
2
3
4
5
6
7
public void onCreate(Bundle savedInstanceStates) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main)
 
    mImageView = (LogoImageView) findViewById(R.id.logoImageView);
    ...
}

setContentView를 하는 순간 layout.main에 정의되어 있는 view들이 모두 생성된다.

위에서 미리 정의해 둔 생성자는 이때 호출이 됨을 유의해야 한다.

posted by Kanais