๋จ์ด ์๋ฏธ
'์กฐ๊ฐ', '๋ถ๋ถ'. ์์ ์กฐ๊ฐ์ด๋ ๋ถ๋ถ์ ์ธ ์์๋ฅผ ๋ํ๋ด๋ ๋ง
์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)์ ์ผ๋ถ๋ฅผ ๋ํ๋ด๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํด๋์ค
ํ๋๊ทธ๋จผํธ : ํ ๊ฐ์ ์กํฐ๋นํฐ ์์์ ํน์ ์์ญ๋ง ๊ต์ฒด
1) Activity
์กํฐ๋นํฐ ๋งค๋์ ์์ ์ธํ
ํธ๋ฅผ ํด์ํด ์กํฐ๋นํฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
2) Fragment
ํ๋์ ์กํฐ๋นํฐ ์์ ํ๋๊ทธ๋จผํธ ๋งค๋์ ์์ ๋ฉ์๋๋ก ํ๋๊ทธ๋จผํธ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
????????????????Activity ๊ฐ์ ํ๋ฉด ์ด๋์ ํ ๋ ์ ๋๋ฉ์ด์ ์ด ๋ฌด์กฐ๊ฑด ์ ์ฉ๋๋ ์ด์ : ์ฒซ ๋ฒ์งธ Activity์ ๋ ๋ฒ์งธ Activity ์ฌ์ด์ ์๊ฐ ์ฐจ๋ฅผ ๋ง์ ์ ์๊ธฐ ๋๋ฌธ
๋ชฉ์ : ๋ณต์กํ UI์ ๋ชจ๋ํ๋ฅผ ํตํ ์ ์ฐํ ๊ด๋ฆฌ
Fragment๋ก ์ผ๋ถ๋ง ๋ฐ๊พธ๋ ๊ฒ์ด ์์ ์ด์ฉ๋์ด ์ ์ด ์๋๊ฐ ๋น ๋ฆ
์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ ๋ค๋ฅธ Activity์์ ๋ ์ธ ์ ์๋ค.
Fragment ๊ฐ์ ๋ฐ์ดํฐ ๊ณต์ ๊ฐ ์ฝ๋ค
๋งค์ฐ ๋ง์์ onCreate, onCreateView, onViewCreated๊น์ง๋ง ๊ธฐ์ตํ์.
์ด ์์ ์๋ ์์ง Fragment View๊ฐ ์์ฑ๋์ง ์์๊ธฐ ๋๋ฌธ์ Fragment์ View์ ๊ด๋ จ๋ ์์ ์ ๋๊ธฐ์ ์ ์ ํ์ง ์๋ค.
์๋ก๋์จ ๊ฒ : onViewCreated, onViewStateRestored, onSaveInstanceState
Fragment๋ฅผ Activity์ ๋ ์ด์์ ํ์ผ ์์์ ์ ์ธ
์๋๋ก์ด๋ ํ๋๊ทธ๋จผํธ๋ฅผ ํ๋ฉด์ ๋ฐฐ์นํ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ
- ๋์
ํ๋ก๊ทธ๋จ ์คํ ์ค์ ํ๋๊ทธ๋จผํธ๋ฅผ ์ถ๊ฐ, ์ ๊ฑฐ, ๋๋ ๊ต์ฒด๊ฐ๋ฅ
์ด ๋ฐฉ๋ฒ์ ์ ์ฐ์ฑ์ด ๋์ ์ฌ์ฉ์์ ์ํธ์์ฉ์ ๋ฐ๋ผ UI๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๋ ์ฃผ๋ก ์ฌ์ฉ
ex) ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์๋ก์ด ํ๋๊ทธ๋จผํธ๋ก ๊ต์ฒดํ ๋
1) ๋์ ์ถ๊ฐ๋ฅผ ์ํด, ๋จผ์ ํ๋๊ทธ๋จผํธ๋ฅผ ๋ด์ ์ ์๋ ์ปจํ ์ด๋(์: FrameLayout ๋๋ FragmentContainerView)๋ฅผ XML ๋ ์ด์์์ ์ ์
2) ์ฝํ๋ฆฐ(๋๋ ์๋ฐ) ์ฝ๋์์ FragmentManager๋ฅผ ์ฌ์ฉํด ํ๋๊ทธ๋จผํธ๋ฅผ ์ถ๊ฐ, ์ ๊ฑฐ, ๊ต์ฒด
- ์ ์
์ ์ ์ถ๊ฐ๋ XML ๋ ์ด์์ ํ์ผ์ ์ง์ ํ๋๊ทธ๋จผํธ๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ด ๋ฐฉ๋ฒ์ ์ฑ์ด ์์๋ ๋ ํ๋๊ทธ๋จผํธ๊ฐ ์๋์ผ๋ก ํ๋ฉด์ ํ์๋๋ฉฐ, ์คํ ์ค์๋ ๋ณ๊ฒฝ๋์ง ์์
์ ์ ์ถ๊ฐ๋ ์ฃผ๋ก UI์ ๋ณํ์ง ์๋ ๋ถ๋ถ์ ์ฌ์ฉ๋ฉ๋๋ค.
ex) ํญ์ ๋ณด์ฌ์ผ ํ๋ ๋ฉ๋ด ๋๋ ํค๋๊ฐ ์ด์ ํด๋น
android:name="com.example.MyFragment"
๊ณผ ๊ฐ์ด name ํ๊ทธ๋ก XML์์ ์ง์ ํ๋๊ทธ๋จผํธ๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ์ด ๋ฐฉ๋ฒ์ ํ๋๊ทธ๋จผํธ๊ฐ UI์ ์ ์ ์ธ ๋ถ๋ถ์ผ ๋ ์ฃผ๋ก ์ฌ์ฉํ๊ณ ์ฝํ๋ฆฐ ์ฝ๋์์ commit ํด ์ค ํ์๊ฐ ์๋ค.
<fragment
android:id="@+id/my_fragment"
android:name="com.example.MyFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
ํ๋๊ทธ๋จผํธ๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ ์ ์๋ ์ปจํ ์ด๋
<FrameLayout
android:id="@+id/my_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
val fragment = MyFragment()
supportFragmentManager.beginTransaction()
.add(R.id.my_frame_layout, fragment)
.commit()
์๋๋ก์ด๋๋ FragmentContainerView๋ฅผ ๊ถ์ฅํ๋ค.
์ด 3๊ฐ์ง ์ค FragmentContainerView๋ฅผ ํ๋๊ทธ๋จผํธ์ ์ปจํ
์ด๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
FragmentContainerView๋ ํ๋๊ทธ๋จผํธ๋ฅผ ์ํ ์ต์ ์ ์ ์ฉ ๋ทฐ
FrameLayout๊ณผ ์ ์ฌํ์ง๋ง, ํ๋๊ทธ๋จผํธ ์ ํ๊ณผ ์ ๋๋ฉ์ด์
์ฒ๋ฆฌ์ ์ต์ ํ๋์ด ์์
<androidx.fragment.app.FragmentContainerView
android:id="@+id/my_fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.MyFragment"/>
val fragment = MyFragment()
supportFragmentManager.beginTransaction()
.replace(R.id.my_fragment_container, fragment)
.commit()
MainActivity์ Fragment๊ฐ ๋ค์ด๊ฐ ์์ญ ์ง์
ํ๋๊ทธ๋จผํธ๋ฅผ ์กํฐ๋นํฐ์ ๋ ์ด์์ ํ์ผ ์์์ ์ ์ธ
onCreateView์์ inflate ํจ์๋ฅผ ํตํด fragment_first.xml ํ์ผ๋ก๋ถํฐ ๋ ์ด์์์ ๋ก๋
(FragmentContainerView๋ฅผ ์ฌ์ฉํ์ ๋)
supportFragmentManager.commit {
replace(R.id.frameLayout, frag)
setReorderingAllowed(true)
addToBackStack("")
}
supportFragmentManager
: ์ฌ์ฉ์ ์ํธ์์ฉ์ ์๋ตํด Fragment๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๋ฑ ์์
์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋งค๋์
replace(R.id.frameLayout, frag)
: '์ด๋ ํ๋ ์ ๋ ์ด์์์ ๋์ธ ๊ฒ์ธ์ง' ์ '์ด๋ค ํ๋๊ทธ๋จผํธ๋ฅผ ๋์ธ ๊ฒ'์ธ์ง
โก R.id.frameLayout์ frag Fragment ๋ฅผ ๋์ธ ๊ฑฐ๋ผ๊ณ ์ง์
setReorderingAllowed
: ์ ๋๋ฉ์ด์
๊ณผ ์ ํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋๋ก ํธ๋์ญ์
๊ณผ ๊ด๋ จ๋ ํ๋๊ทธ๋จผํธ์ ์ํ ๋ณ๊ฒฝ์ ์ต์ ํ
์ ๋๋ฉ์ด์
์ด ์์๊ฒ ๋ณด์ด๋ ค๋ฉด ํญ์ ํด์ผํจ(?)
addToBackStack
: ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ ํด๋ฆญ์ ๋ค์ ์ก์
(์ด์ fragment๋ก ๊ฐ๊ฑฐ๋ ์ฑ์ด ์ข
๋ฃ๋๊ฑฐ๋)
๋์ /์ ์
๋์ ์ถ๊ฐ : ํ๋ก๊ทธ๋จ ์คํ ์ค์ ํ๋๊ทธ๋จผํธ๋ฅผ ์ ์ฐํ๊ฒ ์ถ๊ฐ, ์ ๊ฑฐ, ๊ต์ฒดํ ์ ์์. ์ฌ์ฉ์ ์ํธ์์ฉ์ ๋ฐ๋ผ UI๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๋ ์ฌ์ฉ.
์ ์ ์ถ๊ฐ : XML ๋ ์ด์์์ ํ๋๊ทธ๋จผํธ๋ฅผ ์ง์ ์ ์ํ๊ณ , ์ฑ ์คํ ์ ์๋์ผ๋ก ํ์. UI์ ๊ณ ์ ๋ ๋ถ๋ถ์ ์ ํฉ.
Activity์ Fragment ์ถ๊ฐ
์๋๋ก์ด๋๋ FragmentContainerView๋ฅผ ๊ถ์ฅํ๋ค.