본문 바로가기
Projects/FineByMe

[Android/Kotlin] 안드로이드에서 Fragment 전환 시 비동기 처리 문제 해결: OnBackStackChangedListener 사용법

by quessr 2024. 6. 27.

안드로이드 앱 개발에서 Fragment 전환 시 발생하는 비동기 처리 문제를 해결하기 위해 FragmentManager.OnBackStackChangedListener를 사용하는 방법을 소개합니다. 이 글에서는 supportFragmentManager.popBackStack()의 비동기적 특성으로 인해 현재 Fragment를 정확하게 가져오지 못하는 문제를 해결하는 과정을 설명합니다.

1. 서론

안드로이드 앱 개발 시, 뒤로가기 버튼을 커스터마이징하여 사용자의 편의성을 높이고자 할 때가 있습니다. 특히 Fragment 전환 시 발생하는 비동기 처리 문제를 해결하는 것이 중요합니다. 이번 글에서는 이러한 문제를 해결하기 위해 FragmentManager.OnBackStackChangedListener를 어떻게 활용할 수 있는지 살펴봅니다.

2. 기본 개념

  • onBackPressedDispatcher와 OnBackPressedCallback 소개
  • FragmentManager.OnBackStackChangedListener의 역할 및 필요성

3. 문제 발생 및 해결 과정

  • 처음에 예상한 대로 동작하지 않는 문제 발생
    • 뒤로가기 버튼을 누른 후 바텀 메뉴가 업데이트되지 않음
    • supportFragmentManager.popBackStack() 호출 후에도 Fragment가 올바르게 업데이트되지 않음
  • 문제 원인 분석
    • supportFragmentManager.popBackStack()이 비동기적으로 동작한다는 것을 알아냄
  • 해결 방법: FragmentManager.OnBackStackChangedListener 사용
    • addBackStackChangedListener 메서드 정의
    • updateCurrentFragment 메서드 정의

4. 코드 설명

초기 설정

onBackPressedDispatcher.addCallback을 사용하여 뒤로가기 버튼을 커스터마이징합니다. 여기서 supportFragmentManager.popBackStack()을 호출하고, 이후 OnBackStackChangedListener를 추가하여 백스택 변경을 감지합니다.

 

private fun handleOnBackPressed() {
    onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            if (supportFragmentManager.backStackEntryCount == 1) {
                showExitConfirmationDialog()
            } else {
                supportFragmentManager.popBackStack()
                addBackStackChangedListener()
            }
        }
    })
}

 

백스택 변경 리스너 추가

addBackStackChangedListener 메서드를 정의하여 백스택 변경 리스너를 추가합니다. 백스택 변경이 감지되면 현재 Fragment를 확인하고, 적절한 바텀 메뉴 항목을 선택합니다.

 

private fun addBackStackChangedListener() {
    supportFragmentManager.addOnBackStackChangedListener(object : FragmentManager.OnBackStackChangedListener {
        override fun onBackStackChanged() {
            supportFragmentManager.removeOnBackStackChangedListener(this)
            updateCurrentFragment()
        }
    })
}

 

현재 Fragment 업데이트

updateCurrentFragment 메서드를 정의하여 현재 표시되고 있는 Fragment를 확인하고, 바텀 메뉴를 업데이트합니다.

 

private fun updateCurrentFragment() {
    val currentFragment = supportFragmentManager.findFragmentById(R.id.frameLayout)
    Log.d("@@@@@@", "currentFragment : $currentFragment")
    when (currentFragment) {
        is PhotoListFragment -> {
            binding.bottomNavigation.menu.findItem(R.id.nav_home).isChecked = true
        }
        is FavoriteListFragment -> {
            binding.bottomNavigation.menu.findItem(R.id.nav_favorite).isChecked = true
        }
    }
}

 

5. 결론

이 방법을 사용하여 안드로이드 앱에서 뒤로가기 버튼을 커스터마이징하고, Fragment 전환 시 발생하는 비동기 처리 문제를 해결할 수 있습니다. 이 과정을 통해 예상한 대로 동작하지 않았던 문제를 해결할 수 있었으며, FragmentManager.OnBackStackChangedListener를 사용하여 비동기적 특성을 관리할 수 있음을 확인했습니다.

 


 

https://github.com/quessr/fine-by-me 

 

GitHub - quessr/fine-by-me: - 사용자가 즐겨찾기한 사진을 저장하고 관리할 수 있는 안드로이드 애플리

- 사용자가 즐겨찾기한 사진을 저장하고 관리할 수 있는 안드로이드 애플리케이션. Contribute to quessr/fine-by-me development by creating an account on GitHub.

github.com