[Android] FragmentManager & FragmentTransaction

๐Ÿ’กFragmentManager & FragmentTransaction์˜ ์—ญํ• ์„ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ๊ธฐ๋กํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

FragmentManager

ํ”„๋ž˜๊ทธ๋จผํŠธ ๊ด€๋ฆฌ์ž  |  Android Developers

 

ํ”„๋ž˜๊ทธ๋จผํŠธ ๊ด€๋ฆฌ์ž  |  Android Developers

์ด ํŽ˜์ด์ง€๋Š” Cloud Translation API๋ฅผ ํ†ตํ•ด ๋ฒˆ์—ญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ž˜๊ทธ๋จผํŠธ ๊ด€๋ฆฌ์ž ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. ์ฐธ๊ณ : Navigation ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ

developer.android.com

  • FragmentManager๋Š” ์•ฑ ํ”„๋ž˜๊ทธ๋จผํŠธ์—์„œ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œ, ๊ต์ฒดํ•˜๊ณ  ๋ฐฑ ์Šคํƒ์— ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • Activity or Fragment์—์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, FragmentActivity ๋ฐ ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • getSupportFragmentManager() ๋ฉ”์„œ๋“œ๋กœ FragmentManager์— ์—‘์„ธ์Šค ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ์—ญํ• 

  • Fragment ์ถ”๊ฐ€, ์ œ๊ฑฐ, ๊ต์ฒด
  • BackStack ๊ด€๋ฆฌ
  • FragmentTransaction

FragmentTransaction

  • FragmentManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Fragment๋ฅผ ์ถ”๊ฐ€, ์ œ๊ฑฐ, ๊ต์ฒด ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ์™€ ๊ฐ™์ด ์ผ๋ จ์˜ ์ž‘์—…๋“ค์„ ๋ฌถ์–ด ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ Fragment ๊ด€๋ จ ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ณ  ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด commitํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FragmentTransaction  |  Android Developers

 

FragmentTransaction  |  Android Developers

androidx.appsearch.builtintypes.properties

developer.android.com

  • FragmentTransaction ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ Fragment Transaction Method ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•œ๋ฒˆ์— ๋ฌถ์–ด ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ FragmentTransaction์€ BackStack์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋’ค๋กœ ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ด์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Fragment Transaction Method

  • add() : ์ƒˆ๋กœ์šด Fragment ์ถ”๊ฐ€
  • replace() : ๊ธฐ์กด์˜ Fragment ๊ต์ฒด
  • remove() : Fragment ์ œ๊ฑฐ
  • hide() : Fragment๋ฅผ ํ™”๋ฉด์—์„œ ์ˆจ๊น€
  • show() : ์ˆจ๊ฒจ์ง„ Fragment ํ‘œ์‹œ
  • attach() : Fragment๋ฅผ ๋‹ค์‹œ ํ™”๋ฉด์— ํ‘œ์‹œ
  • detach() : Fragment๋ฅผ ํ™”๋ฉด์—์„œ ๋ถ„๋ฆฌ

BackStack ๊ด€๋ฆฌ

  • BackStack์€ Fragment ํŠธ๋žœ์žญ์…˜์„ ๊ธฐ๋กํ•˜์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ๋’ค๋กœ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ด์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • addToBackStack() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ BackStack์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
fragmentTransaction.replace(R.id.fragment_container, newFragment)
fragmentTransaction.addToBackStack(null)  // ํŠธ๋žœ์žญ์…˜์„ BackStack์— ์ถ”๊ฐ€
fragmentTransaction.commit()
  • Fragment ํŠธ๋žœ์žญ์…˜์— ์•„๋ž˜์™€ ๊ฐ™์ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „ํ™˜ ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left)

์ฃผ์˜์ 

  • ์ƒํƒœ ์†์‹ค ๋ฐฉ์ง€
    • commit()์€ UI ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋ฉฐ, ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์ค‘๋‹จ๋œ ์ƒํƒœ์—์„œ ํ˜ธ์ถœํ•˜๋ฉด IllegalStateException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ commitAllowingStateLoss()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒํƒœ ์†์‹ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • UI ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์‹คํ–‰
    • UI๊ฐ€ ์•„๋‹Œ ์Šค๋ ˆ๋“œ์—์„œ Fragment ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•˜๋ฉด ์•ฑ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

supportFragmentManager

  • FragmentManager์˜ ์ธ์Šคํ„ด์Šค๋กœ Activity์— ์ง์ ‘ ์ถ”๊ฐ€๋˜๋Š” Fragment๋“ค์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Activity์—์„œ Fragment๋ฅผ ์ถ”๊ฐ€, ๊ต์ฒด, ์ œ๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • FragmentTranscation์„ ๊ด€๋ฆฌํ•˜๋ฉฐ BackStack์„ ํ†ตํ•ด ๋’ค๋กœ ๊ฐ€๊ธฐ ๋™์ž‘ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

childFragmentManager

  • Fragment ๋‚ด์—์„œ ๋˜ ๋‹ค๋ฅธ Fragment๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” FragmentManager์ž…๋‹ˆ๋‹ค.
  • Fragment ๋‚ด์— ์ž์‹ Fragment๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Nested Fragment(์ค‘์ฒฉ ํ”„๋ž˜๊ทธ๋จผํŠธ), ViewPager2, ํƒญ ๋ ˆ์ด์•„์›ƒ, ๋‹ค์ค‘ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ Fragment์—์„œ ์ž์‹ Fragment๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌ

  • FragmentManager๋Š” Android์—์„œ Fragment์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
  • Fragment ํŠธ๋žœ์žญ์…˜์€ FragmentManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Fragment๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€, ์ œ๊ฑฐ, ๊ต์ฒดํ•˜๋Š” ์ž‘์—…์„ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ์ด๋“ค์„ ํ†ตํ•ด UI ์ „ํ™˜์„ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, BackStack์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋™์ž‘์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.