안드로이드

[Android] Fragment replace add 차이

코딩하는후운 2022. 11. 4. 16:06
반응형

안드로이드 Fragment replace vs add 

replace()

동일한 containerViewId로 추가 했던 모든 프래그먼트에 대해서 remove(Fragment)를 호출하고
새로운 프래그먼트를 추가하는 것이다.

add()

동일한 containerViewId로 추가 했던 프래그먼트를 remove하는 것이 아니라 그 위에 프래그먼트를 추가하게 된다.


예) addToBackStack()이 사용되지 않은 add()

Activity
add Fragment A
add Fragment B
add Fragment C
remove Fragment C

[Back button]
Activity - onDestroy()
Fragment A : onDestroy()
Fragment B : onDestroy()



백버튼을 누르면 액티비티가 종료되기 때문에 추가되었던 프래그먼트 모두 없애주게 된다.


예) addToBackStack()이 사용되지 않은 replace()

Activity
add Fragment A
add Fragment B

(replace Fragment C)
Fragment B : onDestroy()
Fragment A : onDestroy()
Fragment C : onAttach()

[Back button]
Activity : onDestroy()
Fragment C : onDestroy()



추가적으로 addToBackStack()을 사용 했을 때에도 살펴보자.
예) addToBackStack()이 사용될 경우 - add()

Activity
add Fragment A
add Fragment B
add Fragment C  onResume까지 호출
remove Fragment C onDestroyView() 까지 호출

[Back button]
Fragment C : onCreateView() - onActivityCreated() - onStart() - onResume()

[Back button]
Fragment C : onPause() - onDetach()

[Back button]
Fragment B : onDetach()

[Back button]
Fragment A : onDetach()

[Back button]
Activity : onDestroy()



remove()를 통해서 C라는 프래그먼트를 지우려고한다.
그런데 onDestroyView까지만 호출되고 onDestroy()와 onDetach()가 호출이 안되었다.

왜 그런걸까?

addToBackStack()을 호출하면, commit()을 호출하기 전에 적용된 모든 변경 내용이
백 스택에 하나의 트랜잭션으로 추가된다고 한다.
그리고 back 버튼을 누르면 모두 한꺼번에 되돌려진다.

즉, 프래그먼트를 제거하는 트랜잭션을 수행할때 addToBackStack()을 호출하지 않는 경우에는
해당 프래그먼트 트랜잭션이 적용되면 소멸이 되고, 사용자가 이를 되짚어 탐색이 불가능하게 된다.

반면에 프래그먼트를 제거하면서 addToBackStack()을 호출하면,
해당 프래그먼트는 중단되고, 사용자가 뒤로 탐색하면 재개된다.

그렇기에 onDestroyView()까지 호출되고,
백버튼을 누를 경우 C프래그먼트가 다시 onCreateView()를 호출하는 것을 확인 할 수 있는 것이다.

이제 연속적으로 백버튼을 누를 경우
C프래그먼트 종료,
B프래그먼트 종료,
A프래그먼트 종료,
액티비티가 종료된다.


예) addToBackStack()이 사용될 경우 - replace()

Activity
add Fragment A
add Fragment B

(replace Fragment C)
Fragment B: onPause - onDestroyView()
Fragment A: onPause - onDestroyView()
Fragment C: onAttach() - onResume()

remove Fragment C : onPause() - onDestroyView()

[Back button]
Fragment C : onCreateView() - onResume()

[Back button]
Fragment C : onPause() - onDetach()
Fragment A : onCreateView() - onResume()
Fragment B : onCreateView() - onResume()

[Back button]
Fragment B : onPause() - onDetach()

[Back button]
Fragment A : onPause() - onDetach()

[Back button]
Activity : onDestroy()




먼저 A와 B를 add()로 추가한다.
그리고 C를 replace()로 대체한다.

이때 B프래그먼트가 중지되고, 다음으로 A가 중지되면서 그 상태가 트랜잭션의 백스택에 저장된다.
그리곤 C프래그먼트가 보여지게 된다.

여기서 C를 remove()하게 되면 액티비티가 보여지게 된다.

백]
C프래그먼트에 대한 트랜잭션이 재개 되면서 다시 C 프래그먼트가 보여지게 된다.

백]
C에 대한 트랜잭션은 백스택에서 사라지게 된다.
그리곤 차례대로 중지되어 있던 A와 B가 onCreateView()를 호출하면서 다시 보여지게 된다.

이제 연속적으로 백버튼을 누르게 되면
B프래그먼트는 백스택에서 사라지게 되고,
A프래그먼트도 백스택에서 사라지게 된다.
마지막으로 액티비티가 종료되게 된다.

 

 

참조 :

https://zzandoli.tistory.com/55

 

[안드로이드 Q&A] 프래그먼트에서 add()와 replace()의 차이점이 무엇일까?

프래그먼트를 주로 사용하면서 add()와 replace()가 과연 어떤 점이 차이점이 있는지 항상 궁금했다. 그래서 각 역할에 대해서 알아보고, 차이점을 정리해보기로 했다. replace()는 아래와 같이 사용된

zzandoli.tistory.com

 

반응형