(kotlin) fragment lifecycle

박용석·2023년 9월 14일
0
  • The fragment lifecycle


공식문서링크

오늘은 프래그먼트의 생명주기에 대해서 공부를 해보자

  • onCreate()

    프래그먼트가 생성될 때 호출된다. 초기화 작업을 수행하는 데 사용
  • onAttach()

    프래그먼트가 액티비티에 연결될 때 호출
  • onCreateView()

    프래그먼트의 뷰 계층 구조를 생성하고 초기화하는 데 사용
  • onActivityCreated()

    프래그먼트가 포함된 액티비티의 onCreate()가 완료된 후 호출
  • onStart()

    프래그먼트가 사용자에게 표시되기 직전에 호출
  • onResume()

    프래그먼트가 사용자와 상호작용 가능한 상태로 되었을 때 호출
  • onPause()

    다른 액티비티나 프래그먼트로 전환되거나 앱이 일시 중지될 때 호출
  • onStop()

    프래그먼트가 더 이상 사용자에게 표시되지 않을 때 호출
  • onDetach()

    프래그먼트가 액티비티와 연결이 해제될 때 호출

프래그먼트의 생명주기 메서드들은 각 단계에서 특정 작업을 수행하기 위해 오버라이드할 수 있으며, 액티비티와 함께 조합하여 프래그먼트의 동작을 컨트롤한다. 프래그먼트가 액티비티와 함께 사용될 때 이러한 생명주기 메서드를 적절하게 구현하여 화면 전환이나 상태 변화에 따른 작업을 처리할 수 있다.

다음으로 간단한 예제를 만들어서 Fragment에 lifecycle을 확인해보자

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.apply {
            fragment1Btn.setOnClickListener {
                setFragment(FirstFragment())
            }
            fragment2Btn.setOnClickListener {
                setFragment(SecondFragment())
            }
        }
        setFragment(FirstFragment())
    }

    private fun setFragment(frag: Fragment) {
        supportFragmentManager.commit {
            replace(R.id.frameLayout, frag)
            setReorderingAllowed(true)
            addToBackStack("")
        }
    }
}

SecondFragment.kr

class SecondFragment : Fragment() {

    // Fragment가 생성될 때 호출
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        Log.d(TAG, "onCreate")
    }

    // 프래그먼트의 뷰를 생성하고 초기화할 때 호출
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // 레이아웃 XML 파일을 인플레이트하여 뷰를 생성
        return inflater.inflate(R.layout.fragment_second, container, false)
    }

    // onCreateView 이후에 호출. UI 요소 초기화 등을 수행할 수 있다.
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    }

    // Fragment가 화면에 표시될 때 호출
    override fun onStart() {
        super.onStart()

        Log.d(TAG, "onStart")
    }

    // Fragment가 사용자와 상호작용 가능한 상태가 될 때 호출
    override fun onResume() {
        super.onResume()

        Log.d(TAG, "onResume")
    }

    // Fragment가 다른 액티비티나 Fragment로 전환되기 전에 호출
    override fun onPause() {
        super.onPause()

        Log.d(TAG, "onPause")
    }

    // Fragment가 화면에서 사라질 때 호출
    override fun onStop() {
        super.onStop()

        // Fragment가 화면에서 사라질 때 호출
        Log.d(TAG, "onStop")
    }

    // onCreateView에서 반환한 뷰와 관련된 리소스를 해제할 때 호출
    override fun onDestroyView() {
        super.onDestroyView()

        // Fragment가 더 이상 사용되지 않을 때 호출
        Log.d(TAG, "onDestroy")
    }

    // Fragment가 더 이상 사용되지 않을 때 호출
    override fun onDestroy() {
        super.onDestroy()

        Log.d(TAG, "onDestroyView")
    }

    // Fragment가 완전히 소멸될 때 호출
    override fun onDetach() {
        super.onDetach()

        Log.d(TAG, "onDetach")
    }

    companion object {
        private const val TAG = "FragmentLifeCycle"
    }
}
  • 결과물

profile
슬기로운 개발 활동

1개의 댓글

comment-user-thumbnail
2023년 9월 15일

오 제 후발대 과제보다 훨씬 낫네요 ㅎㅎ

답글 달기