바텀네비케이션으로 하단 메뉴 탭을 구현하던 도중, Fragment 상태에 따라 StatusBar의 색상과 해당 탭의 Fragment 배경색을 변경해줘야했다. StatusBar는 Activity에서 변경 가능하지만 배경색의 경우 Fragment에 바인딩 된 뷰를 건드려야 했기 때문에 난감했다.
class MainActivity : AppCompatActivity() {
...
private fun showFragment(fragment: Fragment, tag: String) {
val findFragment = supportFragmentManager.findFragmentByTag(tag)
supportFragmentManager.fragments.forEach { fm ->
supportFragmentManager.beginTransaction().hide(fm).commitAllowingStateLoss()
}
findFragment?.let {
// 프래그먼트 상태 정보가 있는 경우, 보여주기만
supportFragmentManager.beginTransaction().show(it).commitAllowingStateLoss()
} ?: kotlin.run {
// 프래그먼트 상태 정보가 없는 경우, 추가
supportFragmentManager.beginTransaction()
.add(R.id.fragmentContainer, fragment, tag)
.commitAllowingStateLoss()
}
}
}
처음에 해당 Fragment에서 onResume()
을 통해 갱신해주면 되지 않을까 했지만 위처럼 단순히 우리 눈에 show, hide 되도록 작성된 코드라서 (상태 유지를 위해) onResume()
가 호출되지 않았다.
// Fragment 상태(show, hide)가 변경될 때마다 호출
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
if (hidden) { // hide일 때
setBaseStatusBar()
} else { // show일 때
changeStatusBarForTime()
}
}
역시나 다행히.. 이런 경우를 위해 onHiddenChanged()
라는 함수가 존재했다 ^_ㅠ
hidden 값을 이용해 조건문으로 원하는 처리를 해주면 된다. 위 코드는 실제 적용한 코드이다.