UI의 재사용 가능한 부분
Fragment는 자체 레이아웃과 수명주기를 가진다.
단, 독립적으로 존재할 수 없고 Activity나 다른 Fragment에서 호스팅되어야 한다.
Activity가 동작하고 있는 동안 Fragment를 add, replace, remove할 수 있다.
class ExampleFragment : Fragment(R.layout.example_fragment)
-> onCreateView() 구현 생략이 가능하다.
class ExampleFragment : Fragment()
-> onCreateView() 구현해야 한다.
FragmentActivity
를 사용해야만 해당 Activity Layout 일부분에 Fragment UI를 배치 할 수 있다. AppCompatActivity
는 FragmentActivity를 상속하고 있으므로 그대로 사용하면 된다.<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.ExampleFragment" />
android:name
속성을 이용해 인스턴스화 시킬 fragment를 지정한다. Activity layout이 inflate되는 과정에서 지정된 fragment가 인스턴스화된다. 인스턴스가 생성되면 onInflate()가 호출 되고 FragmentTransaction
이 생성되어 fragment를 FragmentManager
에 추가하게 된다.<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:name
속성을 사용하지 않고 FragmentTransaction
을 이용해 Fragment를 인스턴스화 시키고 Activity layout에 추가한다. (첫 번째 방법과 달리 Fragment가 자동으로 인스턴스화 되지 않는다.)FragmentManager
클래스를 인스턴스화 함으로 FragmentTransaction
클래스를 사용할 수 있다. 이 때FragmentTransaction
클래스가 제공하는 add함수를 호출해 Fragment를 추가할 수 있다.class ExampleActivity : AppCompatActivity(R.layout.example_activity) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
supportFragmentManager.commit {
setReorderingAllowed(true)
add<ExampleFragment>(R.id.fragment_container_view)
}
}
}
}
위에 코드는 savedInstanceState
가 null인 경우에만 FragmentTransaction
을 생성해서 Activity가 처음 만들어졌을때 Fragment를 추가하게 한다. 만약 Activity가 재생성 된다면 savedInstanceState
는 더 이상 null이 아니기 때문에 Fragment가 더 추가되지 않는다. 그리고 기존 Fragment는 savedInstanceState
에서 자동적으로 복구된다.
Fragment 생성 시 초기 데이터가 필요하다면 FragmentTransaction.add()
할 때 아래와 같이 Bundle
을 넘겨주면 된다.
class ExampleActivity : AppCompatActivity(R.layout.example_activity) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
val bundle = bundleOf("some_int" to 0)
supportFragmentManager.commit {
setReorderingAllowed(true)
add<ExampleFragment>(R.id.fragment_container_view, args = bundle)
}
}
}
}
requireArguments()
를 호출해서 다음과 같이 적절한 get method를 사용한다.class ExampleFragment : Fragment(R.layout.example_fragment) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val someInt = requireArguments().getInt("some_int")
...
}
}