안녕하세요
현재 MainActivity 위에 4개의 fragment를 두고, bottom navigation bar에서 show/hide 해주는 방식으로 뷰를 보여주고 있고, 4개의 fragment 내에는 glide를 사용하여 이미지를 보여주고 있고, recyclerView를 통해 서버에서 불러온 데이터들을 보여주고 있습니다.
fragment 내의 recyclerView의 item을 클릭할 시 fragment를 add하여 보여주고 있는데,
addBackStack을 추가해주어 뒤로가기 버튼을 통해 종료해주거나, 상단의 toolbar에 뒤로가기 버튼을 추가하여 이를 터치해줄 시, remove해주는 방식으로 구현하였습니다.
문제는 이렇게 recyclerView를 통해 파생된 fragment가 bottomNavigation을 통해 4개의 주가되는 fragment로 넘어가면 종료되지 않고, stack에 남아있어, 새로 띄울 때 문제가 발생한다는 것입니다.
그래서 저는 MainActivity에서 4개의 주가 되는 fragment가 아니면 remove하고, 맞으면 hide 해주는 방식으로 구현해주었는데,
private fun setFragment(tag: String, fragment: Fragment) {
val transaction = supportFragmentManager.beginTransaction()
val findFragment = supportFragmentManager.findFragmentByTag(tag)
supportFragmentManager.fragments.forEach { fm ->
if(fm.tag == HomeFragment.TAG || fm.tag == RankFragment.TAG || fm.tag == BookmarkFragment.TAG || fm.tag == UserFragment.TAG) {
transaction.hide(fm)
} else {
transaction.remove(fm)
}
}
findFragment?.let {
transaction.show(it)
} ?:kotlin.run {
transaction
.add(R.id.fg_MainContainer, fragment, tag)
}
transaction.commitAllowingStateLoss()
}
이렇게 하면, glide를 통해 이미지를 불러온 작업이 초기화가 되는지 이미지가 로딩되지 않습니다.
위의 코드에서 4개의 주가 되는지 확인하여 hide하거나 remove해주는 작업을 제외하고.
그냥 hide만 해주면, 이미지가 잘 뜨고요...
fragment 내에서 hidden을 확인하여, adapter를 notiftDataSetChanged()를 통해 강제적으로 한번 더 로딩해주는 방법도 사용해보았는데,
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
if(!hidden) {
adapter.notifyDataSetChanged()
}
}
이렇게 하면, 화면이 바뀔 때 마다, 이미지 로딩을 하는 것인지, 빈화면에서 이미지가 채워지는 그러한 보기싫은 현상이 생겨버립니다ㅠㅠ
혹시 MainActivity 위에서 fragment 만으로 보여주는 화면을 구성하고,
bottom navigation을 통해 뷰를 왔다갔다 할 때, bottom navigation 내에서 이동할 수 있는 fragment 외의 다른 fragment들을 control 할 수 있는 방법이 무엇이 있을까요? 제가 잘못 구현하고 있는 것일까요?
답변 주시면 감사하겠습니다!