Fragment를 만들 때 보편적으로 많이 사용하는 방식은

val fragment = FirstFragment()

위 처럼 사용할 것이다. Fragment를 생성하는 쪽에서 데이터를 넘겨줘야 하는 경우가 종종 있는데 이럴때 보편적으로

val age = 1
val fragment = FirstFragment(age)

위 처럼 사용했다. 이렇게 생성자로 바로 넘겨주는 방법을 사용했다 앱이 강제종료 되는 현상을 한번쯤은 겪어보지 않았을까 싶다. Fragment의 공식문서를 확인하면 주의사항이 적혀있다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6f6ad1f7-8732-4705-8e3a-085cd34217c1/_2021-04-07__11.29.11.png

Fragment를 상속받을 땐 인자가 없는 기본 생성자를 반드시 포함해야 한다는 내용이다. Fragment는 자기만의 라이프사이클을 가지고 있지만 액티비티 라이프사이클에 종속적이다. 따라서 메모리가 부족하거나 화면회전, 디스플레이 변경 등의 다양한 이벤트로 액티비티가 재생성 될 때 프래그먼트도 재생성이 된다.

더 자세한 정보는 여기

위에 같은 이유로 프래그먼트의 잦은 재생성이 일어난다. 이를 해결하는 방법으로 newInstance()를 활용하는 것이다.

companion object {
	  fun newInstance(): ThirdFragment {
        val fragment = ThirdFragment()
       val args = Bundle()
        args.putInt("test", 1)
        fragment.arguments = args

        return fragment
    }
}

Fragment 내부에 newInstance() 이름의 static 메서드를 만들고, 빈 생성자로 Fragment 인스턴스를 생성한다.

key-value 형식으로 bundle에 데이터를 저장한다.

arguments로 Fragment에 전달할 데이터를 설정한다.

Fragment에선 arguments로 전달된 데이터를 꺼내서 사용할 수 있다.

val age = 1
val fragment = FirstFragment.newInstance(age)

AndroidX 부터는 instantiate()는 deprecated 되었고 FragmentFactory의 instantiate를 사용해 구현하라고 나와있다.