Android & Kotlin/Android

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

말린밴댕이_공부 2023. 5. 9. 00:23
반응형

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

 

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
    }
}

 

반응형