마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

액티비티 소멸 후 재생성 되었을 때 bottomNavigationView의 selectedItem이 유지되는 이유가 뭘까요?

0 추천
안녕하세요, bottomNavigationView를 사용하던 중에 궁금한 점이 생겨서 질문 드립니다.

구성 변경으로 액티비티가 재실행되면, 프래그먼트와 달리 액티비티에서는 View의 UI 데이터까지 전부 초기화되는 것으로 알고 있었습니다. 근데 이번에 실험을 해보니, 소멸 전에 선택되었던 bottomNavigationView의 아이템이 그대로 유지되더군요. 3번째 메뉴를 클릭해놓고, 화면을 돌렸는데 그대로 3번째 메뉴가 선택되어 있었습니다.
 
그래서 TextView도 테스트를 해봤는데, TextView는 또 UI 상태 유지가 안되라구요. 이유가 뭘까요? 제가 잘못 알고 있었던 건지, bottomNavigationView가 특이 케이스인 건지 정말 궁금합니다.
이륙사 (370 포인트) 님이 2022년 2월 8일 질문
이륙사님이 2022년 2월 8일 수정

1개의 답변

+1 추천
 
채택된 답변
Configuration change 를 말씀하시는 것 같네요. 네비게이션 컴포넌트를 사용하셨다면 네비게이션 컴포넌트가 자동으로 상태를 관리해 줍니다. OnItemSelecteListener를 달아서 return값을 true로 해줘도 선택되었던 아이템을 유지해 줍니다.
spark (227,470 포인트) 님이 2022년 2월 8일 답변
이륙사님이 2022년 2월 8일 채택됨
네 Configuration change 맞습니다!
근데 네비게이션 컴포넌트랑 셀렉트 리스너를 사용 안해도 화면 돌리면 선택된 아이템이 그대로 유지가 되던데, 혹시 왜 그런지 아시나요?
액티비티는 기본적으로 재실행되면 View UI 상태가 초기화되는 건 맞는 거죠?
이거땜에 되게 헷갈리네요..ㅠㅠ
아마 소스코드를 보시면 안드로이의 대부분의 뷰가 그렇듯이 Confiuration change 을 핸들링할 수있는 코드가 들어 있을 겁니다. 안드로이드가 화면을 복구할 때 화면의 뷰들의 복구용 메소드를 호출해 주도록 되어 있습니다. 이걸 구현해 놓으면 상태복구가 되는 거구요.
아 그렇군요.
제가 프래그먼트 관련해서 Developer 문서를 찾아봤을 때, 안드로이드 프레임워크에서 만든 뷰들은 다 상태복구 메소드들이 있다는 정보를 본 기억이 있습니다. 그런데 프래그먼트는 ViewLifecycle이 따로 있는 데다, 액티비티 관련 문서에서는 정확한 정보를 찾아볼 수가 없어서 프래그먼트에서만 그런 것인지, 액티비티에서도 해당되는 건지 헷갈리더라구요.

그래서 액티비티의 TextView로 실험을 해봤는데, TextView에서는 복구가 안되니 프래그먼트에서만 그런가보다 싶었습니다. 그런데, 액티비티에서도 해당이 되나 보군요. TextView에서는 제 실험이 잘못됐던 걸까요?

참고로 제가 실험했던 코드는 다음과 같습니다. 화면을 돌렸을 때, text랑 text색상이 purple색 그대로 나올까 싶었는데 안나오더라구요ㅠㅠ
if (savedInstanceState == null) {
            binding.bottomView.selectedItemId = R.id.fragment2
            binding.textView.text = "hi"
            binding.textView.setTextColor(ContextCompat.getColor(this, R.color.purple_500))
        }

계속 답변 주셔서 정말 감사합니다.
TextView의 소스에 onSaveInstanceState, onRestoreInstance가 있습니다. 이 메소드의 구현 내용에 따라 상태를 저장 복구해 주는데, 소스를 찾아보니
mFreezesText 값에 따라 텍스트를 복구해주도록 되어 있는데, 이게 기본값이 false로 되어 있네요. TextView.setFreezesText(true)를 호출해 주니 화면에서 동적으로 설정했던 텍스트가 저장이 되는 것 같네요.
와 그렇네요 정말 감사합니다. 혼자 알아보려고 했으면 한참 해맸을 거 같아요. 앞으론 공식 문서 뿐만 아니라 소스코드도 열심히 읽어봐야겠네요. 다시 한번 감사드립니다.
...