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>
댓글 없음:
댓글 쓰기