이번 포스트는 프래그먼트에서 뒤로가기 버튼을 눌렀을 때, 원래 있었던 프래그먼트로 돌아오는 것을 알아보겠다.
각 사이트들에서 참조한 정보이다.
참고로 설명할 코드들은 자바 코드로 설명하겠다. 그러나 코틀린으로도 쉽게 변환해서 사용가능하다.
프래그먼트 뒤로가기 누르면 원상복구
원래 나는 프래그먼트 뒤로가기를 누를 때, 프래그먼트를 띄운 Activity에서 onBackPressed()를 오버라이딩 해서 하드코딩해서 구현했었다. 그러나 찾아보니 프래그먼트도 액티비티 스택처럼 스택으로 관리하는 방법이 있었다.
우선 원래 나는 다음과 같이 프래그먼트를 호출했다.
getSupportFragmentManager().beginTransaction().replace(R.id.(액티비티_콘테이너), new 프래그먼트이름()).commit(); |
이렇게 하면 액티비티에 있는 container 레이아웃에 아예 다른 프래그먼트로 대체를 하는 것이다.
따라서 저장이 되지 않는다.
만약 대체를 시키면서 현재 프래그먼트를 저장시켜 놓으려면 다음과 같이 코드를 만들면 된다.
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.(액티비티_콘테이너), new 프래그먼트이름()) .addToBackStack(null).commit(); |
추가된 것은 addToBackStack(null)만 추가해주면 된다.
이렇게 만들면 새로 대체된 프래그먼트에서 뒤로가기 버튼을 눌러도 원래 존재했던 프래그먼트가 등장하게 된다.
프래그먼트 제거 후 원래 프래그먼트 띄우기
이제, 프래그먼트를 스택에 쌓는 방법은 알았다. 그러면 코드 상에서 띄운 프래그먼트를 지우고 스택에 저장된 프래그먼트를 띄우는 방법은 무엇일까
메서드를 두 번 띄우면 위와같은 기능을 쉽게 구현할 수 있다.
내가 띄웠는데 동적으로 사라지게 하고싶은 프래그먼트에서 동작할 부분에 다음과 같은 코드를 넣어주면 된다.
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); getActivity().getSupportFragmentManager().popBackStack(); |
이렇게 만들어주면 동적으로 현재 띄운 프래그먼트를 제거할 수 있다.
popBackStack()으로 띄우는 이전 프래그먼트에 데이터 전달하기.
프래그먼트를 스택에 저장하고, 띄우는 것까지 알았다.
그러면 원래 스택에 있었던 프래그먼트에 데이터를 전달하는 방법은 무엇일까?
우리는 액티비티에서 지금은 Deprecated된 StartActivityForResult() 메서드를 알고있다.
프래그먼트도 비슷한 메서드가 존재한다.
만일 B 프래그먼트 -> A 프래그먼트로 데이터를 전달한다고 해보자.
그렇다면 B 프래그먼트에 다음과 같은 코드를 추가해준다.
getActivity().getSupportFragmentManager().setFragmentResult(requestKey값, bundle객체); |
이렇게되면 B 프래그먼트가 종료됐을 때, A 프래그먼트가 요청값을 받을 콜백 메서드가 존재한다면
bundle객체를 전달할 수 있게된다.
A 프래그먼트에는 다음과 같은 코드를 추가해주면 된다.
getParentFragmentManager().setFragmentResultListener(getString(R.string.request_key), this, new FragmentResultListener() { @Override public void onFragmentResult(String requestKey, Bundle result) { //작업할 내용 } }); |
이런식으로 만들어주면 이전에 있던 프래그먼트에도 값을 전달할 수 있게 된다.
자세한 내용은 최상단에 구글 공식 문서에서 확인할 수 있다.
'안드로이드 > 개발 관련' 카테고리의 다른 글
[Kotlin] 안드로이드 데이터 바인딩, 데이터 결합, Data Binding (0) | 2021.10.12 |
---|---|
[Kotlin] 안드로이드 뷰 바인딩, 뷰 결합, View Binding (2) | 2021.09.29 |
[Android] 정리해야 할 개발기술 목록 - 계속 업데이트중 (0) | 2021.08.11 |
[Android] startActivityForResult Deprecated된 이유와 해결책 (0) | 2021.07.28 |
[Kotlin]2020-여름 안드로이드 첫 앱. 알람메모-Alamemo (0) | 2021.07.15 |