본문 바로가기
Android & Kotlin/Android

[안드로이드 코틀린] 바텀네비게이션 프래그먼트 전환시 상태 유지

by 말린밴댕이_공부 2023. 5. 9.
반응형

바텀 네비게이션을 전환만 한다고 생각을 하지만 우리는 카카오톡 애플리케이션을 보게 되면 친구창에서 바텀 네비게이션에 있는 다른 채팅을 가게 되었을때 다시 친구 창에 돌아오면 위치를 저장하는 것을 보실 수 있습니다.

 

private fun runBottomNavi() {
    binding.btmNavMain.run {
        setOnItemSelectedListener { item ->
            val selectedFragment: Fragment = when (item.itemId) {
                R.id.btm_home -> HomeFragment()
                R.id.btm_chatting -> ChattingFragment()
                R.id.btm_post -> PostFragment()
                R.id.btm_profile -> ProfileFragment()
                else -> HomeFragment()
            }

            supportFragmentManager.beginTransaction()
                .replace(R.id.frm_main, selectedFragment)
                .addToBackStack(null) // 백스택에 현재 프래그먼트를 추가
                .commitAllowingStateLoss()

            true
        }
        selectedItemId = R.id.btm_home
    }
}

위의 기존의 코드처럼 작성을 하게 된다면 돌아올때 상태값을 잊어버리고 다시 띄우게 됩니다.

 

 

하지만 아래의 코드처럼 작성을 show키워드를 사용하게 된다면 편의성을 기를 수 있습니다.

 

또한 null이라면 이라는 선택지를 통해 중복적으로 프래그먼트가 add 하는 것을 방지해주면 오직

네가지를 키고 전환하고 다시 돌아왔을때 스크롤이나 작업 상태를 저장하는 것을 보실 수 있습니다.

private fun runBottomNavi() {
    binding.btmNavMain.run {
        setOnItemSelectedListener { item ->
            val fragmentTag: String = when (item.itemId) {
                R.id.btm_home -> "HOME_FRAGMENT"
                R.id.btm_chatting -> "CHATTING_FRAGMENT"
                R.id.btm_post -> "POST_FRAGMENT"
                R.id.btm_profile -> "PROFILE_FRAGMENT"
                else -> "HOME_FRAGMENT"
            }

            var selectedFragment = supportFragmentManager.findFragmentByTag(fragmentTag)

            supportFragmentManager.beginTransaction().apply {
                // 기존에 추가된 프래그먼트를 숨김
                supportFragmentManager.fragments.forEach { hide(it) }

                if (selectedFragment == null) {
                    selectedFragment = when (item.itemId) {
                        R.id.btm_home -> HomeFragment()
                        R.id.btm_chatting -> ChattingFragment()
                        R.id.btm_post -> PostFragment()
                        R.id.btm_profile -> ProfileFragment()
                        else -> HomeFragment()
                    }
                    add(R.id.frm_main, selectedFragment!!, fragmentTag)
                } else {
                    // 선택된 프래그먼트를 표시
                    show(selectedFragment!!)
                }
            }.commitAllowingStateLoss()

            true
        }
        selectedItemId = R.id.btm_home
    }
}

 

반응형

댓글