[Android] Fragment란

sw·2021년 12월 20일
0
post-custom-banner

1. Fragment란?

UI의 재사용 가능한 부분


2. Fragment 특징

Fragment는 자체 레이아웃과 수명주기를 가진다.
단, 독립적으로 존재할 수 없고 Activity나 다른 Fragment에서 호스팅되어야 한다.
Activity가 동작하고 있는 동안 Fragment를 add, replace, remove할 수 있다.

2. Fragment 생성 방법

  1. xml파일을 정의하고 Fragment 생성자 안에 resource Id값을 넣어준다.
class ExampleFragment : Fragment(R.layout.example_fragment)
	-> onCreateView() 구현 생략이 가능하다.
  1. default 생성자 함수 이용
class ExampleFragment : Fragment()
	-> onCreateView() 구현해야 한다.
    

3. Activity에 Fragment 호스팅 시키기

  • FragmentActivity를 사용해야만 해당 Activity Layout 일부분에 Fragment UI를 배치 할 수 있다. AppCompatActivity는 FragmentActivity를 상속하고 있으므로 그대로 사용하면 된다.
  • Activity layout 안에 FragmentContainerView를 정의해서 fragment가 배치될 위치를 정의한다.

  1. Activity XML안에 Fragment 추가
<!-- 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에 추가하게 된다.

  1. 프로그래밍적으로 Fragment 추가
<!-- 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가 자동으로 인스턴스화 되지 않는다.)
  • Activity가 running 상태일 동안 프로그래밍적으로 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)
            }
        }
    }
}
  • Bundle을 받을 Fragment에선 requireArguments()를 호출해서 다음과 같이 적절한 get method를 사용한다.
class ExampleFragment : Fragment(R.layout.example_fragment) {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val someInt = requireArguments().getInt("some_int")
        ...
    }
}
profile
끄적끄적
post-custom-banner

0개의 댓글