안드로이드 Fragment - show, hide 상태 체크하기

임현주·2022년 10월 31일
0
post-thumbnail

문제

바텀네비케이션으로 하단 메뉴 탭을 구현하던 도중, 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 값을 이용해 조건문으로 원하는 처리를 해주면 된다. 위 코드는 실제 적용한 코드이다.

profile
🐰 피드백은 언제나 환영합니다

0개의 댓글