본문 바로가기

Android/에러

could not find Fragment constructor

안녕하세요? 닉네임간편입니다. 이번 시간에는 제목에 있는 오류에 대해서 설명드리겠습니다.

1. 개요

이 에러는 RuntimeException 중 하나로, 프래그먼트를 만들 때 인자를 넣어서 만들었기 때문에 발생합니다.

왜냐하면 프래그먼트를 재생성할 때 빈 생성자가 있어야 하기 때문입니다.

따라서 인자를 넣어주고 싶다면 프래그먼트 자체를 만들 때 인자를 넣지 말고, 두 가지 방법을 사용할 수 있습니다.

1) FragmentFactory 이용

이 방법을 이용하면 프래그먼트에 인자를 넣어서 만들어줄 수 있습니다. 그러나 현재 이 방법을 이용하면 동일한 이름의 프래그먼트에 대해서는 다른 값을 줄 수 없기 때문에(제가 방법을 아직 못 찾은 걸수도 있지만) 사용하지 않았습니다.

2) arguments 이용

arguments는 프래그먼트의 기본 프로퍼티이기 때문에 선언 없이 사용할 수 있습니다. 번들 객체를 arguments에 전달하면 생성된 프래그먼트에서 arguments로 꺼낼 수 있습니다. 또한 화면이 재생성될 때에도 이를 이용하면 데이터를 보존할 수 있습니다.

따라서 저는 이 방법을 사용했습니다.

2. 사용법

앞서 사용했던 arguments를 이용하는 방법에 대해 설명드리겠습니다.

[데이터를 전달할 때]

val fragmentMenu = FragmentMenu()
var bundle = Bundle()
bundle.putParcelableArrayList("list", selectListKorean)
fragmentMenu.arguments= bundle

먼저 프래그먼트를 생성합니다.

이후 Bundle 객체의 PutOOO 메서드를 사용해서 '키'에 해당하는 값을 넣어줍니다.

이때 ArrayList를 전달하고 싶다면 위의 putParcelableArrayList() 메서드를 사용하면 됩니다.

이후 프래그먼트 객체의 arguments에 번들 객체를 전달합니다.

[데이터를 받을 때]

FragmentMenu 클래스 내부의 onCreateView() 메서드 안에서 데이터를 가져옵니다.

selectList1 = arguments?.getParcelableArrayList<SelectFoodItem>("list") 
							as ArrayList<SelectFoodItem>

3. 마무리

이번 시간에는 Fragment 관련 에러에 대해서 알아보았습니다.

저도 이 에러를 마주하기 전까진 프래그먼트 자체에 인자를 넘기는 경우가 있었는데요, 앞으로는 조심해서 사용할 것 같습니다.

728x90
반응형