ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 개인 과제 트러블 슈팅 - 프래그먼트 트랜잭션
    Android 2024. 5. 7. 22:39

    문제 시연 영상

    문제 상황

    문제 상황

    내 보관함으로 이동하고 다시 이미지 검색으로 넘어갔을 때 프래그먼트가 초기화가 된다. (+ 하트도 지워진다)

    문제 코드

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(binding.root)
    
            setFragment(SearchFragment()) // fragment 방식을 replace 와 add 비교해서 다음엔 add 적용해보기
    
            binding.apply {
                btnSearch.setOnClickListener {
                    setFragment(SearchFragment())
                }
                btnStore.setOnClickListener {
                    val fragment = StoreFragment.newInstance(selectedImageList)
                    setFragment(fragment)
                }
            }
        }
        
    private fun setFragment(fragment:Fragment) {
            supportFragmentManager.commit {
                replace(R.id.frameLayout,fragment)
                setReorderingAllowed(true)
                addToBackStack("")
            }
        }

    문제 원인

    프래그먼트 트랜잭션에서 replace를 설정하면 안된다.

     


    해결 시연 영상

    해결 시연 영상

     

    해결 코드

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            Log.d("MainActivity","onCreate")
            setContentView(binding.root)
    
            supportFragmentManager.beginTransaction()
                .setReorderingAllowed(true)
                .add(R.id.frameLayout,searchFragment) // 어짜피 onCreate는 한번만 실행되니까 add 를 쓰자!
                .commit()
    
            binding.apply {
                btnSearch.setOnClickListener {
                    supportFragmentManager.beginTransaction()
                        .setReorderingAllowed(true)
                        .addToBackStack(null)
                        .remove(storeFragment) // remove를 한 이유: 보관함 프래그먼트는 계속 업데이트 되어야 하니까 + hide를 하면 add할때 계속 프래그먼트 쌓임
                        .show(searchFragment) // 핵심코드!
                        .commit()
                }
    
                btnStore.setOnClickListener {
                    supportFragmentManager.beginTransaction()
                        .setReorderingAllowed(true)
                        .addToBackStack(null)
                        .hide(searchFragment)
                        .add(R.id.frameLayout,storeFragment)
                        .commit()
                }
            }
        }

     

    해결 방법

    처음 액티비티가 onCreate 되었을 때, 아래 버튼이 눌렸을 때 프래그먼트 설정을 다르게 해줘야한다고 판단했다.

    replace 대신 add나 hide, remove, show 등을 이용해서 문제를 해결했다.

     

    결론

    프래그먼트의 트랜잭션 함수를 차이를 정확하게 알아야 한다.

     

     

Designed by Tistory.