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
}
}
반응형