관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] 프래그먼트 백스택 (fragment backstack) 본문

안드로이드/자바 & Previous

[안드로이드] 프래그먼트 백스택 (fragment backstack)

막무가내막내 2019. 8. 10. 13:25
728x90

 

프래그먼트는 프래그먼트 매니저를 통해 불러와진다. 

 

그래서 자바소스파일에서 프래그먼트를 추가하고 싶다면 프래그먼트매니저를 사용해야한다.

프래그먼트와 이에 대한 설명을 간단히 하자면 다음과 같습니다.


출처: https://www.edwith.org/boostcourse-android/lecture/17074/

만약 소스 코드에서 프래그먼트를 추가하고 싶다면 프래그먼트 매니저를 사용해야 합니다.

프래그먼트는 프래그먼트 매니저가 관리하기 때문에 프래그먼트 매니저를 통해 화면에 추가하거나 다른 프래그먼트로 교체하거나 하는 일을 할 수 있습니다.

프래그먼트 매니저는 getSupportFragmentManager 메소드를 호출하면 참조할 수 있고 XML 레이아웃에 추가된 프래그먼트는 findFragmentById 메소드를 호출하여 찾아낼 수 있습니다.

프래그먼트도 수명주기 메소드가 있으며 프래그먼트의 상태에 따라 자동으로 호출됩니다.

그 중에서 onAttach 메소드와 onDetach 메소드는 프래그먼트가 액티비티 위에 올라갈 때 호출되며 매우 중요합니다.

왜냐하면 프래그먼트는 액티비티 위에 올라가 있을 때만 프래그먼트로서 동작할 수 있기 때문입니다.

프래그먼트에서 액티비티의 메소드를 호출하거나 액티비티에서 프래그먼트의 메소드를 호출하면 프래그먼트와 액티비티 간에 필요한 데이터를 전달하거나 필요한 기능을 수행하도록 할 수 있습니다.

이렇게 메소드 호출 방식을 이용하는 이유는 액티비티 간에 데이터를 전달할 때 인텐트를 사용하는 것처럼 프래그먼트에서도 인텐트를 사용할 수는 없기 때문입니다.

액티비티가 시스템 역할을 하긴 하지만 인텐트를 이해하도록 만들어지지는 않은 것이죠.

 

프래그먼트에서 액티비티의 메소드를 호출할 때는 인터페이스를 사용하는 것이 일반적이라는 것도 기억해야 합니다. 

 


이걸보고 난 평소에 귀찮아서 getActivity()로 하는 습관이 있는데 인터페이스를 이용해야하는 습관을 많이 기르도록 해야겠다고 생각했다.

 

 

다시본론으로 돌아가면, 이번에는 프래그먼트를 하면서 백스택을 이용한 것에 대해 포스팅할려고한다.

프래그먼트 백스택을 이용하는 경우는 다음과같을수 있겠다.  프래그먼트를 add했을 떄 뒤로가기하면 프래그먼트에서 뒤로가기 되는게 아니라 액티비티상에서 onBackPressed가 되므로 해당 액티비티가 사라지거나 앱이종료되는 내가 생각하는 대로 흘러가지 않을 때가 많다. (예를 들어 한 프래그먼트에서 다른  프래그먼트로 전환을 했는데 뒤로가기를 하면 이전 프래그먼트가 나오게 하고픈데 앱이 종료되거나 그 프래그먼트를 담고있는 액티비티가 종료되는?)

 

만약 백스택을 이용하면 뒤로가기를 눌렀을 때 액티비티를 종료시키는게 아니라 스택에 쌓여진 프래그먼트를 없에주므로 뒤로가기를 눌렀을 때 프래그먼트가 쌓여있는 경우 액티비티 종료가아닌 프래그먼트를 제거해주는 상황을 만들 수 있을 것이다. 

앞서 말한것처럼 프래그먼트를 자바코드 상에서 전환할려면 프래그먼트 매니저를 참조해서 전환시켜주면 된다.

그 코드의 예시는 다음과 같다. 간단하다 (컨테이너 id라는 프레임레이아웃에 프래그먼트를 add시켜주는 코드이다)

    FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction().add(R.id.main_container, movieInfoFragment);

여기에다가 addToBackStack(null); 을 해주고 commit을 해주면 된다.

BackStack은 beginTransacition 부터 commit 까지의 전환 자체를 저장하고 있다.

BackStack의 현재 카운트(개수)는 프래그먼트매니저의 getBackStackCount()로 알 수 있다.

만약 addBackStack을 안하고 그냥 commit을 한 경우는 back키를 누르면 바로 액티비티가 종료될 것이다.

그리고 popBackStack()은 BackStack을 하나씩 pop하는 메소드이고 비동기적으로 되있다.

  // 해당 transaction 을 Back Stack 에 저장
                transaction.addToBackStack(null);
                // transaction 실행
                transaction.commit();

 

 

백버튼 클릭시 액티비티의 뒤로가기가 바로 호출되는게 아닌 프래그먼트의 스택을 먼저 제거하고 전환시키고 싶다면 addToBackStack(null); 을 이용하면 될 것 같다.

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다!

 

참고 및 출처:

https://mydevromance.tistory.com/34 , 

https://www.edwith.org/boostcourse-android/lecture/17074/

728x90
Comments