조각을 분리하는 것과 제거하는 것의 차이점은 무엇입니까?


118

A에 대한 안드로이드 문서에서 하여 FragmentTransaction 나는이 매우 유사한 방법을 발견 : detachremove. 저기있는 설명은 각각을 언제 사용해야하는지에 대한 통찰력을 제공하지 않는 것 같습니다.

그래서 :이 두 가지 방법의 차이점은 무엇입니까?

답변:


156

detach 메서드는 UI에서 조각을 제거하지만 조각 관리자가 해당 상태를 유지합니다. 즉, 수정 된 ViewHierarchy를 사용하여 연결 메서드를 호출하여이 조각을 재사용 할 수 있습니다.

제거는 조각 인스턴스를 다시 연결할 수 없음을 의미합니다. 조각 트랜잭션에 다시 추가해야합니다.

소스 설명

Fragment가 분리되면 onPause, onStop 및 onDestroyView 메서드가 해당 순서로만 호출된다는 것을 알 수 있습니다. 반면에 Fragment가 제거되면 onPause, onStop, onDestroyView, onDestroy 및 onDetach 메서드가 해당 순서대로 호출됩니다. 마찬가지로 연결할 때 Fragment의 onCreateView, onStart 및 onResume 메서드 만 호출됩니다. 추가 할 때 Fragment의 onAttach, onCreate, onCreateView, onStart 및 onResume 메서드가 해당 순서대로 호출됩니다. – Adil Hussain


145
Rajdeep의 대답에 추가하려면, 당신은이 때 것을 알 수 Fragment있다 분리 , 그것의 onPause, onStoponDestroyView방법은 (순서대로)에만 호출된다. A는 한편, Fragment되는 제거 는, onPause, onStop, onDestroyView, onDestroyonDetach(순차) 방법이라고한다. 마찬가지로 때, 부착Fragment'들 onCreateView, onStartonResume방법은 호출된다; 언제 부가 상기 Fragment집은 onAttach, onCreate, onCreateView, onStartonResume방법 (순서대로)라고한다.
Adil Hussain

1
여기 Diane Hackborn과의 빠른 Q & A가 있습니다 . 그래서 내가 왜해야합니까 로그를? FT.detach ()가 호출되었는지 어떻게 알 수 있습니까?
Poutrathor

1
다른 것보다 하나의 이점은 무엇입니까? 하나가 다른 것보다 유리한 사용 사례를 알고 싶습니까? 나는 항상 추가하고 제거합니다.
Neon Warge

1
가장 짧고 간결한 설명.
Robotec

55

프래그먼트 관리 방법의 이름은 메시지 보드의 Google 엔지니어에 따르면 매우 혼란 스럽습니다 (위의 주석 참조). 실제로 어떻게 작동하는지 알아보기 위해 약간의 데모를 만들었습니다. 여기 내 결과가 있습니다. 내가 틀렸다면 자유롭게 수정하십시오.

처음에 Fragment를 Activity에 추가하려면 getFragmentManager (). beginTransaction (). add (R.id.container, mFragment) .commit ()을 사용합니다.

이렇게하면 액티비티가 프래그먼트와 연결되고 뷰도 프래그먼트와 연결됩니다.

결과 라이프 사이클 이벤트 및 기타 중요한 메서드 반환 값은 다음과 같습니다.

onAttach()           
onCreate()           
onCreateView()       
onViewCreated()      
onActivityCreated()  
onViewStateRestored()
onStart()            
onResume()

mFragment.getView() == null: false                    
mFragment.getActivity() == null: false

액티비티에서 Fragment를 제거하려면 getFragmentManager (). beginTransaction (). remove (mFragment) .commit ()을 사용합니다.

이렇게하면보기 또는 활동과의 모든 연결이 제거됩니다.

결과 라이프 사이클 이벤트 및 기타 중요한 메서드 반환 값은 다음과 같습니다.

onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()

mFragment.getView() == null: true
mFragment.getActivity() == null: true

여기에 조각을 다시 추가했습니다.

활동에서 추가 된 Fragment를 분리하려면 getFragmentManager (). beginTransaction (). detach (mFragment) .commit ()을 사용합니다.

이렇게하면보기와의 모든 연결이 제거되지만 활동과의 연결은 유지됩니다.

결과 라이프 사이클 이벤트 및 기타 중요한 메서드 반환 값은 다음과 같습니다.

onPause()                             
onStop()                              
onDestroyView()                      

mFragment.getView() == null: true
mFragment.getActivity() == null: false

Activity에 분리 된 Fragment를 다시 연결하려면 getFragmentManager (). beginTransaction (). attach (mFragment) .commit ()을 사용합니다.

그러면 조각과 연결할 새보기가 생성되고 활동 연결이 유지됩니다.

결과 라이프 사이클 이벤트 및 기타 중요한 메서드 반환 값은 다음과 같습니다.

onCreateView()                        
onViewCreated()                       
onActivityCreated()                   
onViewStateRestored()                 
onStart()                             
onResume()                            

mFragment.getView() == null: false
mFragment.getActivity() == null: false

주의해야 할 기타 중요한 사항 : Fragment를 분리 한 다음 attach () 대신 add ()를 사용하여 다시 추가하려고하면 아무것도 변경되지 않는 것 같습니다.

add () 대신 attach ()를 사용하여 remove ()를 사용하여 제거 된 Fragment를 추가하려고하면 아무것도 변경되지 않는 것 같습니다.

getView ()가 null을 반환하면 Fragment는 마지막으로 생성 한 View에 대한 내부 참조를 계속 가질 수 있습니다. 이보기는 더 이상 유효하지 않으며 사용해서는 안됩니다.


1
잘 했어. 그러나 재 부착과 재 추가를 시도하면 조각이 제거 된 후에도 동일한 효과가 나타나는 것은 꽤 흥미로 웠습니다.
stdout

9
그래서 "attach ()"는 onAttach ()를 호출하지 않습니다. "detach ()"는 onDetach ()를 호출하지 않습니다.
KunYu Tsai

1
그리고 이러한 수명주기 이벤트 중 일부는 트랜잭션을 백 스택에 보관하면 약간 변경 될 수 있습니다.
stdout
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.