Grusie 안드로이드 개발 기술 블로그

[Android] Fragment를 newInstance()로 생성해야 하는 이유 본문

안드로이드 개발/뷰

[Android] Fragment를 newInstance()로 생성해야 하는 이유

grusie 2024. 4. 2. 09:19
728x90
반응형
SMALL

회사 프로젝트를 개발하던 중, RuntimeException이 계속 발생했었다. 프래그먼트를 생성하는 부분에서 에러가 발생한 것으로 로그가 보였으나, 테스트 할 때에는 에러가 발생하지 않아 당황했었다. 휴대폰 기종마다 다른 건가? 라고 생각하다가, 에러 양이 많아질수록 조급해져 찾아보다가 오픈채팅방에 질문을 통해 알게 되었다.

 

프래그먼트는 이런 저런 이유로 재생성이 자주 된다. 회사 프로젝트는 화면 회전을 막아뒀기에 다시 그려질 일이 없다고 생각하였으나, 다크모드로 변경하거나, 폰트 사이즈를 변경하는 등의 동작을 했을 때 화면을 새로 그리면서 RuntimeException이 발생하게 되었던 것이다.

 

이유로 발생한 이유는 Fragment생성 시에, 액티비티에서 생성자에 파라미터를 넘겨서 생성하였기 때문이라는 것을 알게 되었다.

 

프래그먼트는 기본적으로 재생성하게 되면, default constructor를 호출하여 재시작한다. <- 인자값을 받지 않는다는 뜻.

그렇기 때문에 생성자에 인자를 넘겨준다면, 사용하는 곳에서 에러가 발생한다는 뜻이다.

 

newInstance()를 활용하여 프래그먼트를 생성하는 방법은 다음과 같다.

 

companion object {
    fun newInstance(visibleToolbarListener: ToolbarVisibleInterface) : NewStoryFragment {
        val fragment = NewStoryFragment()
        fragment.visibleToolbarListener = visibleToolbarListener
        return fragment
    }
}

실제 프로젝트에서 사용한 코드이다.

visibleToolbarListener를 생성자의 파라미터로 넘겨받아 프래그먼트를 생성해서 반환해준다.

 

다음부터 프래그먼트를 생성할 때 파라미터를 넘기고 싶으면 이렇게 사용하면 될 것이다.

반응형
LIST