마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

transaction 관련 질문

0 추천

안녕하세요

현재 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 할 수 있는 방법이 무엇이 있을까요? 제가 잘못 구현하고 있는 것일까요?

답변 주시면 감사하겠습니다!

 

 

 

 

hand (1,150 포인트) 님이 2022년 12월 27일 질문
프레그먼트를 add, show/hide하는 경우는 라이프사이클이 replace하는 것과는 다르게 먹기 때문에 그에 따른 추가적인 처리가 필요할 것으로 보입니다.
그리고 님의 경우는 일반적으로 사용하지 않는 방식으로  프레그먼트를 사용하고 있기 때문에 부분적인 코드만으로는 어디가 문제라고 짚어내기가 쉽지 않을 것 같네요.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...