programing

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

telebox 2023. 8. 5. 10:04
반응형

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

다음 메소드를 호출할 때의 주요 차이점은 무엇입니까?

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

기존의 fragment를 교체하고, fragment를 활동 상태에 추가하고, 활동을 백스택에 추가한다는 것은 무엇을 의미합니까?

두째로와 함께.findFragmentByTag()에 합니까?add()/replace() 방법또 그는그addToBackStack()방법?

한가지 더 중요한 차이점은add그리고.replace다음과 같습니다.

replace기존 조각을 제거하고 새 조각을 추가합니다.이것은 당신이 뒤로 버튼을 누르면 대체된 조각이 그것으로 생성된다는 것을 의미합니다.onCreateView발동 중인반면에.add되어 ' 것을 새 fragment를 합니다. 로 버튼을 누르면 fragment는 'fragment' 상태가 되지 않습니다. 이는 기존 fragment가 활성화되어 뒤로 버튼을 누를 때 해당 fragment가 'fragment' 상태가 되지 않음을 의미합니다.onCreateView기존 fragment(새 fragment가 추가되기 전에 있었던 fragment)에 대해 호출되지 않습니다.

fragment의 파의수명관점서에의사건주편기▁in서관에점'▁terms파▁of▁fragments▁cycle.onPause,onResume,onCreateView그리고 다른 라이프 사이클 이벤트들은 다음과 같은 경우에 실행될 것입니다.replace하지만 이 경우에는 호출되지 않습니다.add.

편집: Greenrobot의 Eventbus와 같은 이벤트 버스 라이브러리를 사용하고 동일한 조각을 재사용하여 조각을 다른 조각 위에 쌓으려면 주의해야 합니다.add 이벤트 버스를 에도 이벤트 버스를 등록합니다.onResume 에등취소에 취소onPause의 각 됩니다.add메소드 중 도 호출하지 . fragment fragment fragment fragment fragment fragment 명않수다호출를습지니하fragment드서메기주는이러한▁fragment▁cycle않다습니▁won.결과적으로 fragment의 각 활성 인스턴스에 있는 이벤트 버스 수신기는 사용자가 원하는 이벤트가 아닐 수도 있는 동일한 이벤트를 처리합니다.

1) fragmentTransaction.addToBackStack(str);

설명 - 이 트랜잭션을 백스택에 추가합니다.즉, 트랜잭션은 커밋된 후에 기억되고 나중에 스택에서 팝업될 때 해당 작업을 되돌립니다.

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

설명 - 컨테이너에 추가된 기존 조각을 바꿉니다.이는 기본적으로 동일한 containerViewId로 추가된 현재 추가된 모든 fragment에 대해 remove(Fragment)를 호출한 다음 여기에 지정된 동일한 인수로 추가(int, Fragment, String)하는 것과 동일합니다.

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

설명 - 활동 상태에 조각을 추가합니다.이 조각은 선택적으로 활동의 컨테이너 보기에 해당 보기(Fragment.onCreateView가 null이 아닌 것을 반환하는 경우)를 가질 수도 있습니다.

기존의 fragment를 교체하고, fragment를 활동 상태에 추가하고, 활동을 백스택에 추가한다는 것은 무엇을 의미합니까?

실행 상태의 모든 활동이 유지되는 스택이 있습니다.조각이 활동에 속합니다.따라서 이를 추가하여 활동에 포함시킬 수 있습니다.

단일 작업에서 여러 조각을 결합하여 다중 창 UI를 구축하고 여러 작업에서 조각을 재사용할 수 있습니다.이 기능은 기본적으로 조각 컨테이너를 다른 레이아웃에서 정의한 경우에 유용합니다.레이아웃의 다른 조각으로 바꾸기만 하면 됩니다.

현재 레이아웃으로 이동할 때 원하는 조각으로 바꿀 해당 컨테이너의 ID가 있습니다.

도 있습니다. backStack의 fragment는 다음과 같습니다.popBackStack()방법.이를 위해 다음을 사용하여 스택에 해당 조각을 추가해야 합니다.addToBackStack()그리고 나서.commit()입니다.이것은 전류가 위에 있는 역순입니다.

findFragmentByTag는 add/replace 메서드 또는 addToBackStack 메서드로 추가된 태그를 검색합니까?

태그를 추가한 방법에 따라 다릅니다.그런 다음 XML에서 부풀렸을 때 또는 트랜잭션에 추가되었을 때 제공된 대로 이전에 정의한 태그를 기준으로 조각을 찾습니다.

참조:조각 트랜잭션

예를 들어 활동에는 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

샘플 프로젝트

여기 차이를 보여주는 사진이 있습니다.add()그리고.replace()

enter image description here

그렇게add()메서드가 FragmentContainer의 이전 조각 위에 조각을 계속 추가합니다.

하는 동안에replace()메소드는 컨테이너에서 이전의 모든 조각을 지우고 조각 컨테이너에 추가합니다.

AddToBackStack이란 무엇입니까?

addtoBackStack는 add및method와 할 수 . method는 add와 replace method입니다.Fragment API에서는 다른 용도로 사용됩니다.

목적이 무엇입니까?

Activity API와 달리 Fragment API는 기본적으로 Back Button 탐색 기능과 함께 제공되지 않습니다.이전 Fragment로 돌아가려면 Fragment에서 addToBackStack() 메서드를 사용합니다.둘 다 이해합시다.

사례 1:

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

enter image description here

사례 2:

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

enter image description here

이미 대답한 오래된 질문이지만, 아마도 다음 예시들은 받아들여진 대답을 보완할 수 있고 나처럼 안드로이드의 새로운 프로그래머들에게 유용할 수 있습니다.

옵션 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

사이의 기본적인 차이add()그리고.replace()다음과 같이 설명할 수 있습니다.

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

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

우리가 다음에 뒤로 버튼을 누를 때.add(), onCreateView의 에는 호출됩니다.replace()뒤로 버튼을 누르면...됩니다. oncreateView는 다음과 같습니다.

주목해야 할 중요한 사항:

Replace와 Replace with backstack의 차이점은 Replace만 사용할 때마다 fragment가 파괴되고(ondestroy()라고 함), replace with backstack을 사용할 때 Destroy()의 fragment가 호출되지 않는다는 것입니다(즉, 뒤로 버튼을 누르면 CreateView()).

우리가 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();

            }
        });

fragment에서 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

fragment에서 replace()를 사용하는 경우

replace() 메서드를 사용하여 첫 번째에서 두 번째 프래그먼트로 이동 -->두 번째 프래그먼트로 이동

 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(첫 번째 조각 바꾸기)의 경우 이 메서드를 추가로 호출합니다(Pause(일시 중지), OnStop(정지), OnDestroyView는 추가로 호출됨)

E/Keshav First Fragment: 일시 중지 중

E/Keshav First Fragment: on Stop

E/Keshav First Fragment: On Destroy View

FragmentManager의 함수 추가 및 교체는 이것들로 설명될 수 있습니다. 1. add는 fragment를 fragment 백스택에 추가하고 당신이 제공하는 것이 주어진 프레임에 다음과 같이 표시된다는 것을 의미합니다.

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

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

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

둘 사이의 주요 유틸리티는 다시 쌓을 때 교체가 조각을 새로 고친다는 것이지만 추가는 이전 조각을 새로 고치지 않는다는 것입니다.

언급URL : https://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtobackstack

반응형