-
개인 과제 트러블 슈팅 - 프래그먼트 트랜잭션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 등을 이용해서 문제를 해결했다.
결론
프래그먼트의 트랜잭션 함수를 차이를 정확하게 알아야 한다.
'Android' 카테고리의 다른 글
개인 과제 트러블 슈팅 - 인터페이스 변수 초기화 (0) 2024.05.09 개인 과제 트러블 슈팅 - filter (0) 2024.05.08 시간복잡도 줄이기(약수의 개수) (0) 2024.05.03 MVC, MVVM, Repository Pattern (0) 2024.05.02 SharedPreferences (2) 2024.05.01