<fragmanet/> 태그 사용 <fragment
android:name="com.example.test11.OneFragment"
android:id="@+id/fragmentView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
FragmentManger로 만든 FragmentTransaction 클래스 필요🍩 FragmentManager
- 액티비티, 부모 프래그먼트가 각각 하나씩 가지고 있는, 자식 프래그먼트를 관리하는 클래스. 얘로 액티비티-프래그먼트, 프래그먼트-자식 프래그먼트가 상호작용할 수 있다.
supportFragmentManager등의 객체임
🍰 FragmentTranscation
- 프래그먼트 추가, 삭제, 관리하는 클래스
- 위의 매니저로 만든 객체.
FragmentTransaction = fragmentManager.beginTransaction()의 형태add(int containerViewId, Fragment fragment): 새로운 프래그먼트 추가replace(int containerViewId, Fragment fragment): 추가된 프래그먼트 대체remove(Fragment fragment): 추가된 프래그먼트 제거commit(): 화면에 적용 (이걸 해야 적용됨!!)
onAttach : 프래그먼트가 액티비티에 종속된 시점에 호출onCreate : 프래그먼트가 만들어졌지만 뷰 세팅은 안된 상태onCreateViewonViewCreated : 프래그먼트의 화면 구성할 뷰 객체 준비. 이 단계에서 View 의 초기 세팅을 하면 안정성을 보장받을 수 있다.onStartonResume : 프래그먼트와 사용자 상호작용 가능한 상태백스택 사용 시 : onResume 이후 프래그먼트 제거되지 않고, onDestroyView함수까지만 호출됨. (onResume->onPause->onStop->onDestroyView) 프래그먼트가 교체될 때 onDestroyView까지만 호출되어 저장됐다가 사용자가 뒤로가기 눌러서 되돌아오면 다시 onCreateView->onViewCreated->onStart->onResume 함수 차례로 호출되어 다시 보이게 됨!!
백스택 미사용 시 : 프래그먼트가 교체될 때 기존의 프래그먼트는 onDestroy까지 호출되어 제거됨

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TwoColorActivity">
<FrameLayout
android:id="@+id/fragmentFrame"
android:layout_width="match_parent"
android:layout_height="300dp"
android:background="#FFEB3B"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button_red_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_margin="10dp"
android:text="Red Fragment" />
<Button
android:id="@+id/button_blue_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/button_red_fragment"
android:layout_margin="10dp"
android:text="Blue Fragment" />
</androidx.constraintlayout.widget.ConstraintLayout>
supportFragmentManger.beginTransaction() 으로 트랜젝션 생성commit으로) class TwoColorActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_two_colors)
settingButtons()
}
private fun settingButtons() {
val redButton = findViewById<Button>(R.id.button_red_fragment) // 빨간 버튼 초기화
val blueButton = findViewById<Button>(R.id.button_blue_fragment) // 파란 버튼 초기화
redButton.setOnClickListener{
val fragmentTransaction = // FragmentTransaction 클래스 객체 생성
supportFragmentManager.beginTransaction() // Fragment 추가, 삭제, 교체 등 가능
fragmentTransaction.replace(R.id.fragmentFrame, RedFragment()) // replace = 교체
fragmentTransaction.commit() // Transaction 이후 반드시 commit() 함수 호출
}
blueButton.setOnClickListener{
val fragmentTransaction = // FragmentTransaction 클래스 객체 생성
supportFragmentManager.beginTransaction() // Fragment 추가, 삭제, 교체 등 가능
fragmentTransaction.replace(R.id.fragmentFrame, BlueFragment()) // replace = 교체
fragmentTransaction.commit() // Transaction 이후 반드시 commit() 함수 호출
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BlueFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F07901"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
class RedFragment : Fragment() {
override fun onCreateView( // Fragment 의 layout 을 연결할 때 쓰는 callback
inflater: LayoutInflater, // 뷰를 생성하는 객체
container: ViewGroup?, // 생성할 뷰(자식 뷰)가 들어갈 부모 뷰
saveInstanceState: Bundle? // 이전 Fragment 객체에서 전달된 데이터(Bundle)
): View? {
return inflater.inflate(R.layout.fragment_red, container, false);
}
}

