2011년 6월 15일 수요일

setLayoutParams 함수 사용시 주의 사항

View 의 크기 등을 변경할 때 setLayoutParams 함수를 사용한다.

setLayoutParams 함수는 ViewGroup 을 상속받은 클래스의 LayoutParams 클래스 인스턴스 를 파라미터로 받는다.

이 때 어떤 LayoutParams 클래스를 사용하느냐가 중요하다.
LinearLayout 또는 FrameLayout 등의 ViewGroup 을 상속받은 클래스들은 각각 자신만의 LayoutParams 클래스를 갖고 있을 수 있다.

setLayoutParams 함수는 사실 ViewGroup.LayoutParams 클래스를 파라미터로 받기 때문에 LinearLayout.LayoutParams 클래스의 인스턴스 가 들어오건 FrameLayout.LayoutPrams 클래스의 인스턴스가 들어오건 컴파일 할 때는 문제를 알리지 않는다.

하지만 실제 setLayoutParams 함수로 넘어간 파라미터는 해당 View 를 포함하고 있는 ViewGroup 자식 클래스의 LayoutParams 클래스로 casting 하게 된다.
이 때 해당 View 를 포함하고 있는 ViewGroup 자식 클래스가 아닌 ViewGroup 클래스 또는 ViewGroup 을 상속받은 다른 클래스의 LayoutParams 클래스 인스턴스를 파라미터로 넘긴 경우 앱 실행 도중 ClassCastException 이 발생하게 된다.
런타임 오류이기도 하고 이 Exception 은 자신이 사용한 setLayoutParams 함수가 잘못되었다고 알려주지 않기 때문에 문제를 파악하기 상당히 어렵다.

결론적으로 setLayoutParams 함수를 사용할 때는 해당 View 를 포함하고 있는 ViewGroup 자식 클래스에 있는 LayoutParams 클래스의 인스턴스를 넘겨야 한다.

예)
아래와 같은 경우 SurfaceView 크기를 변화하기 위해 setLayoutParams 함수에 LinearLayout.LayoutParams 클래스 인스턴스를 넘겨야 한다.
<LinearLayout ...>
<SurfaceView ... />
</LinearLayout>

댓글 없음:

댓글 쓰기