Android popUpTo가 동작하지 않는 경우
DoDoBest
·2023. 11. 13. 22:39
Android Navigation Component에서 제공하는 popUpTo를 설정했음에도 불구하고, 뒤로가기를 눌렀을 때, 해당 Fragment로 이동하지 않는 경우가 발생했습니다.
원인
popUpTo로 설정한 Fragment가 backstack에 존재하지 않아, popUpTo가 동작하지 않았습니다. 이것은 RuntimeException으로 발생하지 않고, Logcat에서 I(info)로 표시됩니다.
아래 사진 Logcat 마지막에 destionation인 Fragment가 backstack에 존재하지 않기 때문에, 설정한 popUpTo가 무시되는 것을 알 수 있습니다.
아래 스택오버플로우 답변을 보고 MessageFragment가 backstack에서 지워지는지 확인해봐야겠다고 생각했했습니다. 그래서 MessagFragment의 onDestoryView, onDestroy가 호출되면 Log를 출력하도록 했습니다. 실제로 MessagrFragment가 지워지는 것을 확인했고, 이것이 원인임을 찾을 수 있었습니다.
https://stackoverflow.com/a/70143987/11722881
backstack에서 지워진 이유
Fragment의 NavGraph를 아래와 같이 구성했습니다.
messageFragment에서 encryptFragment로 action이 실행될 때, popUpTo를 welcomeFragment로 설정했습니다.
encryptFragment에서 anotherFragment로 action이 실행될 때, popUpTo를 messageFragment로 설정했습니다.
action이 실행되면 현재 Fragment부터 popUpTo로 지정한 Fragment 전까지(popUpToInclusive가 false인 경우) 모든 fragment가 backstack에서 즉시 제거된다는 사실을 몰랐습니다.
WelcomFragment - MessageFragment - EncryptFragment - AnotherFragment로 이어지는 backstack을 살펴보면 아래와 같이 됩니다.
welcomeFragment
welcomeFragment -> messageFragment
welcomeFragment -> encryptFragment
welcomeFragment -> encryptFragment -> anotherFragment
messageFragment에서 encryptFragment로 바뀔 때, popUpTo가 welcomeFragment로 설정되어 있기 때문에 messageFragment는 backstack에서 지워집니다.
encryptFragment에서 anotherFragment로 바뀔 때, popUpTo가 messageFragment로 설정되어 있지만 messageFragment가 backstack에 없기 때문에 popUpTo가 무시됩니다. 따라서 encryptFragment가 backstack에서 지워지지 않습니다.
messageFragment에서 encryptFragment로 이동할 때 설정한 popUpTo를 지우면, anotherFragment에서 설정한 popUpTo가 정상적으로 동작합니다.
'학습' 카테고리의 다른 글
for .. in 은 무엇일까 (0) | 2024.03.08 |
---|---|
Android에서 ConstraintLayout은 왜 사용하는 걸까 (0) | 2024.03.03 |
Android에서 View는 어떻게 그려질까? - 1 (0) | 2024.02.28 |
RecyclerView 공백 ViewHolder 문제 (0) | 2024.02.14 |
Android에서 Retrofit은 왜 사용하는 걸까 (0) | 2024.02.08 |