본문 바로가기

안드로이드 개발 팁/일반

프래그먼트(Fragment)를 사용하면 에러가 나요!

안드로이드 3.0부터 소개되었던 프래그먼트(Fragment)는 기존의 액티비티+레이아웃 혹은 뷰+레이아웃을 사용하는 화면 구성 방식에 비해 훨씬 유연하며, 좀 더 체계적으로 화면을 관리할 수 있도록 합니다.

그런데, 아직 프래그먼트가 소개된지 얼마 되지 않아, 이를 올바르게 구현하지 않아 오류가 발생하는 경우가 잦습니다. 이 글에서는 그 중 대표적인 오류에 대해 다뤄보려 합니다.

이 문제는 런타임시 발생하는 오류로, 일반적으로 개발 중 테스트시에는 잘 보이지 않다가 실제 사용자들이 애플리케이션을 사용할 때 주로 발생합니다. 오류 발생시 나타나는 오류 메시지는 다음과 같습니다.

java.lang.RuntimeException: Unable to start activity ComponentInfo{액티비티명}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment [프래그먼트명]: make sure class name exists, is public, and has an empty constructor that is public

 
이 문제는 구현한 프래그먼트에 기본 생성자가 구현되어 있지 않아 발생하는 문제입니다. 이와 관련된 사항은 개발자 문서의 Fragment 설명에 나와있는 부분이기는 한데, 사실 눈에 잘 띄지 않아 빼먹기 쉽더군요.. ㅠㅠ 관련 내용은 다음과 같습니다.

All subclasses of Fragment must include a public empty constructor. The framework will often re-instantiate a fragment class when needed, in particular during state restore, and needs to be able to find this constructor to instantiate it. If the empty constructor is not available, a runtime exception will occur in some cases during state restore.

 
 예를 들어, MyFragment라는 프래그먼트를 구현하면서 MyFragment(String name)과 같은 생성자만 구현하고, MyFragment() 생성자를 구현하지 않아 발생하는 문제입니다.

구현에 따라 적절히 MyFragment()와 같은 기본 생성자를 구현하면 위의 오류에서 벗어날 수 있습니다. :)