안녕하세요? 닉네임간편입니다. 이번 시간에는 제목에 있는 오류에 대해서 설명드리겠습니다.
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 관련 에러에 대해서 알아보았습니다.
저도 이 에러를 마주하기 전까진 프래그먼트 자체에 인자를 넘기는 경우가 있었는데요, 앞으로는 조심해서 사용할 것 같습니다.
'Android > 에러' 카테고리의 다른 글
java.lang.NoSuchMethodError: No virtual method elapsedNow()D in class Lkotlin/time/TimeMark (0) | 2021.12.30 |
---|---|
Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ (1) | 2021.12.23 |
Missing required view with ID (0) | 2021.12.21 |
Expected BEGIN_OBJECT but was STRING at line 1 column 1 (0) | 2021.12.20 |
android:exported (0) | 2021.12.13 |