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

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

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



답변

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


답변

프래그먼트 관리 방법의 이름은 메시지 보드의 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에 대한 내부 참조를 계속 가질 수 있습니다. 이보기는 더 이상 유효하지 않으며 사용해서는 안됩니다.


답변