add (), replace () 및 addToBackStack ()의 ​​차이점


300

이 메소드를 호출하는 것의 주요 차이점은 무엇입니까?

fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);

이미 존재하는 조각을 대체하고 조각을 활동 상태에 추가하고 활동을 백 스택에 추가한다는 것은 무엇을 의미합니까?

둘째,로 / 메소드 또는 메소드 findFragmentByTag()에 의해 추가 된 태그를 검색 합니까?add()replace()addToBackStack()

답변:


331

1) fragmentTransaction.addToBackStack(str);

설명 -이 트랜잭션을 백 스택에 추가하십시오. 이는 트랜잭션이 커밋 된 후에 기억되고 나중에 스택에서 튀어 나오면 작업을 취소한다는 것을 의미합니다.

2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

설명 -컨테이너에 추가 된 기존 조각을 교체합니다. 이것은 동일한 containerViewId로 추가 된 모든 현재 추가 된 프래그먼트에 대해 remove (Fragment)를 호출 한 다음 여기에 제공된 동일한 인수로 add (int, Fragment, String)을 호출하는 것과 본질적으로 동일합니다.

삼) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)

설명 -활동 상태에 단편을 추가하십시오. 이 프래그먼트는 선택적으로 액티비티의 컨테이너 뷰에 대한 뷰 (Fragment.onCreateView가 null이 아닌 경우)를 가질 수도 있습니다.

이미 존재하는 조각을 대체하고 조각을 활동 상태에 추가하고 활동을 백 스택에 추가한다는 것은 무엇을 의미합니까?

실행 중 상태의 모든 활동이 유지되는 스택이 있습니다. 조각은 활동에 속합니다. 따라서 활동에 포함시키기 위해 추가 할 수 있습니다.

단일 활동에서 여러 단편을 결합하여 다중 창 UI를 빌드하고 여러 활동에서 단편을 재사용 할 수 있습니다. 이것은 다른 레이아웃에서 프래그먼트 컨테이너를 정의했을 때 유용합니다. 레이아웃의 다른 조각으로 바꾸면됩니다.

현재 레이아웃으로 이동하면 해당 컨테이너의 ID를 사용하여 원하는 조각으로 바꿉니다.

popBackStack()메소드 를 사용하여 backStack의 이전 조각으로 돌아갈 수도 있습니다 . 이를 위해를 사용하여 스택에 해당 조각을 추가 addToBackStack()한 다음 commit()반영해야합니다. 이것은 전류가 맨 위에있는 순서와 반대입니다.

findFragmentByTag는 add / replace 메소드 또는 addToBackStack 메소드에 의해 추가 된 태그를 검색합니까?

태그를 추가 한 방법에 따라 다릅니다. 그런 다음 XML에서 부 풀릴 때 또는 트랜잭션에 추가 할 때 제공 한 것으로 정의한 태그로 조각을 찾습니다.

참조 : FragmentTransaction


2
시작 활동이 시작될 때 교체 방법으로 조각을 추가 할 수 있습니까?
Yohanes AI

(어떤 단편 전에 첨가하지 않았다)
Yohanes AI에게

2
replace () 메서드가 동작하는 방식보다 조각 컨테이너에 둘 이상의 조각이 포함될 수 있습니까? 컨테이너 또는 안드로이드 API의 모든 조각을 대체하면 frgamentContainer, 새로운 조각 및 교체 대상과 같은 세 가지 인수를 허용하는 메소드가 있습니다.
ved

1
@ved 아니요, 컨테이너에 현재 존재하는 모든 조각을 현재 조각으로 바꿉니다.
reubenjohn

330

와의 add또 다른 중요한 차이점은 다음 과 replace같습니다.

replace기존 조각을 제거하고 새 조각을 추가합니다. 즉, 뒤로 버튼을 누르면 교체 된 조각 onCreateView이 호출 된 상태로 생성 됩니다. add기존 조각을 유지하고 새로운 조각을 추가하는 반면 기존 조각은 활성 상태이고 '일시 중지'상태 onCreateView가 아니므로 기존 조각 (이전 조각은 이전 조각이 있던 조각)에 대해 뒤로 버튼을 누를 때 호출되지 않습니다. 추가).

조각의 라이프 사이클 이벤트의 측면에서 onPause, onResume, onCreateView및 다른 라이프 사이클 이벤트의 경우 호출됩니다 replace하지만이 경우 호출 될 실 거예요 add.

편집 : Greenrobot의 Eventbus 와 같은 일종의 이벤트 버스 라이브러리를 사용 하고 동일한 조각을 재사용하여 조각을 다른 via 위에 쌓을 경우 조심해야합니다 add. 이 시나리오에서는 모범 사례를 따르고 이벤트 버스를 onResume등록 및 등록 해제 하더라도 이벤트 onPause조각은 add조각화가 이러한 조각 수명주기 방법 중 하나를 호출하지 않으므로 추가 된 조각의 각 인스턴스에서 계속 활성화됩니다 . 결과적으로 프래그먼트의 각 활성 인스턴스에서 이벤트 버스 리스너는 원하는 이벤트가 아닌 동일한 이벤트를 처리합니다.


1
하나의 접근 방식은 최상위 조각에서 이벤트를 처리하고 처리가 완료된 후 cancelEventDelivery ()를 호출하는 것일 수 있습니다. cancelEventDelivery () 메소드에 대한 자세한 내용은 여기를 참조
Jeevan

6
나에게서 +1 현재 프래그먼트를 새로운 프래그먼트로 교체한다는 것은 매우 중요합니다. 즉, 프래그먼트 스택에서 다시 돌아올 때 이전 프래그먼트를 다시 생성하여 다시 가져옵니다.
AndaluZ

onPause, onResume은 호스트 활동과 밀접하게 연관되어 있습니다. 그리고 그들은 조각을 교체 할 때 전화하지 않았습니다.
Zar E Ahmer

다만, 모든 eventbus를 호출 할 것이다 당신이 EventBus를 사용하는 경우는 태그와 함께 조각을 추가하고, 이벤트에 태그 및 어쨌든 확인하는 것이 단편에서 전달할 수 있습니다,이에 추가, 당신은 단지 하나가 실행해야하는 지정
user2582318

add () 또는 replace () 메소드와 함께 addToBackStack ()을 호출한다고 언급해야합니다.
rahil008

99

예를 들어 활동에 2 개의 조각이 있고 활동의 레이아웃에 각 조각을 FragmentManager바꾸거나 추가 하는 데 사용 합니다addToBackstack

교체 사용

조각 이동 1

Fragment1: onAttach
Fragment1: onCreate
Fragment1: onCreateView
Fragment1: onActivityCreated
Fragment1: onStart
Fragment1: onResume

조각 이동 2

Fragment2: onAttach
Fragment2: onCreate
Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment2: onCreateView
Fragment2: onActivityCreated
Fragment2: onStart
Fragment2: onResume

팝 프래그먼트 2

Fragment2: onPause
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment2: onDetach
Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

팝 파편 1

Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach

추가 사용

조각 이동 1

Fragment1: onAttach
Fragment1: onCreate
Fragment1: onCreateView
Fragment1: onActivityCreated
Fragment1: onStart
Fragment1: onResume

조각 이동 2

Fragment2: onAttach
Fragment2: onCreate
Fragment2: onCreateView
Fragment2: onActivityCreated
Fragment2: onStart
Fragment2: onResume

팝 프래그먼트 2

Fragment2: onPause
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment2: onDetach

팝 파편 1

Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach

샘플 프로젝트


1
모든 액션 에 대해 onPause()이전 onStop()에 호출 되지 않았 습니까?
iCantC

addToBackStack ()에 대해서는 누락되었지만 'add ()'와 'replace ()'를 구별하는 훌륭한 대답. upvote에
Shirish Herwade에게

@ShirishHerwade 두 경우 모두 addToBackStack으로 add와 replace의 차이점을 보여주었습니다.
CyberShark

38

그것은 이미 대답 한 오래된 질문이지만 다음 예제는 허용 된 답변을 보완 할 수 있으며 Android의 일부 새로운 프로그래머에게 유용 할 수 있습니다.

옵션 1- "addToBackStack ()"은 사용되지 않습니다

사례 1A-추가, 제거 및 뒤로 버튼 클릭

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               App is closed, nothing is visible

사례 1B-추가, 교체 및 뒤로 버튼 클릭

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               App is closed, nothing is visible

옵션 2- "addToBackStack ()"은 항상 사용됩니다

사례 2A-뒤로 추가, 제거 및 클릭

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Fragment B is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

사례 2B-추가, 교체, 제거 및 뒤로 버튼 클릭

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView()  
Fragment A :        onPause() - onStop() - onDestroyView() 
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Activity is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onCreateView() - onActivityCreated() - onStart() - onResume()   
Fragment B :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

옵션 3- "addToBackStack ()"이 항상 사용되는 것은 아닙니다 (아래 예에서 w / o는 사용되지 않음을 나타냄)

사례 3A-뒤로 추가, 제거 및 클릭

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

사례 3B-추가, 교체, 제거 및 뒤로 버튼 클릭

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()   
Fragment A :        onPause() - onStop() - onDestroyView() 
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Activity is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

1
충분합니다. 좋은 노력!
pulp_fiction

프래그먼트 뒤로 버튼으로 작업하는 동안 FragmentManager.popBackStack () 함수와 유사한 방식으로 작동한다고 말할 수 있습니까?
Tintin

좋은 답변, 더 나을 수 없습니다. 이 답변을 수락해야합니다.
Shirish Herwade

25

사이의 기본적인 차이 add()와는 replace()같이 설명 될 수 있습니다 :

  • add() 루트 요소에 단편을 추가하는 데 사용됩니다.
  • replace() 비슷하게 동작하지만 처음에는 이전 조각을 제거한 다음 다음 조각을 추가합니다.

우리가 사용할 때 우리는 정확한 차이를 볼 수 있습니다 addToBackStack()와 함께 add()또는replace() .

add()...의 경우에 뒤로 버튼을 누르면 onCreateView가 호출되지 않지만,의 경우에 replace()뒤로 버튼을 누르면 ... oncreateView가 매번 호출됩니다.


1
이전 조각의 뷰가 파괴되지 않기 때문에 add () 결과 안드로이드 메모리 측면에서 더 많은 부담이 발생합니까?
Derekyy

@Derekyy 예, 그렇게 생각합니다.
Arpit J.

내가 찾던 것입니다
parvez rafi

2

add () 메소드를 사용하여 첫 번째 조각 추가-> 두 번째 조각

 btn_one.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"Click First 
Fragment",Toast.LENGTH_LONG).show();

                Fragment fragment = new SecondFragment();
                getActivity().getSupportFragmentManager().beginTransaction()
                        .add(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
//                        .replace(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();

            }
        });

조각에서 add ()를 사용할 때

E/Keshav SecondFragment: onAttach
E/Keshav SecondFragment: onCreate
E/Keshav SecondFragment: onCreateView
E/Keshav SecondFragment: onActivityCreated
E/Keshav SecondFragment: onStart
E/Keshav SecondFragment: onResume

조각에서 replace ()를 사용할 때

replace () 메소드를 사용하여 First-> Second의 첫 번째 조각에서 두 번째 조각으로 이동

 btn_one.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"Click First Fragment",Toast.LENGTH_LONG).show();

                Fragment fragment = new SecondFragment();
                getActivity().getSupportFragmentManager().beginTransaction()
//                        .add(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
                        .replace(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();

            }
        });

E/Keshav SecondFragment: onAttach
E/Keshav SecondFragment: onCreate

E/Keshav FirstFragment: onPause -------------------------- FirstFragment
E/Keshav FirstFragment: onStop --------------------------- FirstFragment
E/Keshav FirstFragment: onDestroyView -------------------- FirstFragment

E/Keshav SecondFragment: onCreateView
E/Keshav SecondFragment: onActivityCreated
E/Keshav SecondFragment: onStart
E/Keshav SecondFragment: onResume

Replace First Fragment의 경우 이러한 메소드는 추가로 호출됩니다 (onPause, onStop, onDestroyView는 추가 호출)

E / Keshav FirstFragment : onPause

E / Keshav FirstFragment : onStop

E / Keshav FirstFragment : onDestroyView


0

FragmentManger의 add 및 replace 함수는 다음과 같이 설명 할 수 있습니다. add는 프래그먼트 백 스택에 프래그먼트를 추가하고 제공 한 지정된 프레임에 표시됨을 의미합니다.

getFragmentManager.beginTransaction.add(R.id.contentframe,Fragment1.newInstance(),null)

2.replace는 주어진 프레임에서 조각을 다른 조각으로 바꾸는 것을 의미합니다.

getFragmentManager.beginTransaction.replace(R.id.contentframe,Fragment1.newInstance(),null)

둘 사이의 주요 유틸리티는 교체를 다시 스태킹 할 때 조각이 새로 고쳐 지지만 add는 이전 조각을 새로 고치지 않는다는 것입니다.


0

유의해야 할 사항 :

백 스택으로 바꾸기와 바꾸기의 차이점은 교체 만 사용할 때마다 프래그먼트가 소멸되고 (ondestroy ()가 호출 됨) 백 스택으로 대체를 사용하면 onDestroy () 프래그먼트가 호출되지 않습니다 (즉, 뒤로 버튼을 누를 때 프래그먼트가 호출됩니다) onCreateView ()와 함께


0

여기서 차이 나타내는 픽처 add()replace()

여기에 이미지 설명을 입력하십시오

그래서 add()방법 은 위에 조각 계속 추가합니다. 는 FragmentContainer의 이전 조각 .

replace()방법 이 모든 것을 지우는 동안 컨테이너에서 이전의 조각을 다음 FragmentContainer에 추가합니다.

addToBackStack은 무엇입니까

addtoBackStack메소드는 add () 및 replace 메소드와 함께 사용할 수 있습니다. Fragment API에서 다른 용도로 사용됩니다.

목적은 무엇입니까?

Activity API와 달리 Fragment API 에는 기본적 으로 뒤로 버튼 탐색이 제공되지 않습니다 . 이전 프래그먼트로 돌아가려면 Fragment에서 addToBackStack () 메소드를 사용하십시오. 둘 다 이해하자

사례 1 :

getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.fragmentContainer, fragment, "TAG")
            .addToBackStack("TAG")
            .commit();

여기에 이미지 설명을 입력하십시오

사례 2 :

getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.fragmentContainer, fragment, "TAG")
            .commit();

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.