프래그먼트 – 액티비티처럼 동작하는 뷰
프래그먼트 소개
프래그먼트는 액티비티 화면을 구성하는 뷰인데, 그 자체만으로는 화면에 아무것도 출력되지 않습니다. 프래그먼트가 다른 뷰와 다른 점은 액티비티처럼 동작한다는 것입니다. 즉, 액티비티에 구현되는 모든 내용은 프래그먼트 클래스에도 작성할 수 있습니다. 탭을 예로 들면 한 개의 액티비티에서 탭의 여러 항목별로 각각의 화면을 프래그먼트로 구현할 수 있다는 말입니다.
참고
https://developer.android.com/guide/fragments?hl=ko
프래그먼트 구현
프래그먼트는 androidx.fragment 라이브러리에서 제공합니다.
dependencies {
//(...생략....)
implementation 'androidx.fragment:fragment-ktx:1.2.5'
}
먼저 프래그먼트 화면을 구성하는 레이아웃 XML 파일을 작성해야 합니다. 그 이유는 프래그먼트 그 자체만으로는 화면에 아무것도 출력되지 않기 때문입니다.
프래그먼트는 Fragment를 상속받아 작성하는 클래스입니다. 프래그먼트 클래스에서 최소한으로 작성해야 하는 함수는 onCreateView()입니다. 이 함수가 자동 호출되며 반환한 View 객체가 화면에 출력됩니다.
프래그먼트 구현
//(... 생략 ...)
import androidx.fragment.app.Fragment
class OneFragment : Fragment() {
lateinit var binding : FragmentOneBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentOneBinding.inflate(inflater, container, false)
return binding.root
}
}
액티비티의 레이아웃 XML에 등록하여 프래그먼트 출력
프래그먼트도 뷰이므로 액티비티 화면의 화면을 구성하는 레이아웃 XML에 등록하여 액티비티 화면에 나오게 할 수도 있습니다. <fragment> 태그의 name 속성에 프래그먼트 클래스를 지정하면 액티비티 화면에 프래그먼트가 출력됩니다.
프래그먼트 출력
<fragment
android:name="com.example.test11.OneFragment"
android:id="@+id/fragmentView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
액티비티 코드에서 프래그먼트 출력
액티비티 코드에서도 직접 프래그먼트 코드 객체를 생성하여 출력시킬 수도 있습니다. 이럴 때는 액티비티의 레이아웃 XML 파일에 프래그먼트가 출력될 뷰를 하나 준비합니다.
프래그먼트를 출력할 뷰 준비
<LinearLayout
android:id="@+id/fragment_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
이 LinearLayout에 코드에서 동적으로 생성한 프래그먼트를 출력할 수 있습니다. 물론 LinearLayout이 아닌 다른 레이아웃 클래스를 이용해도 됩니다.
코드에서 프래그먼트를 동적으로 제어(추가, 제거 등)하려면 FragmentManager로 만든 FragmentTransaction 클래스의 함수를 이용
프래그먼트 동적 제어
val fragmentManager: FragmentManager = supportFragmentManager
val transaction: FragmentTransaction = fragmentManager.beginTransaction()
val fragment = OneFragment()
transaction.add(R.id.fragment_content, fragment)
transaction.commit()
코드에서 동적으로 프래그먼트를 제어하는 함수
함수 | 설명 |
add(int containerViewId, Fragment fragment) | 새로운 프래그먼트를 화면에 추가합니다. |
replace(int containerViewId, Fragment fragment) | 추가된 프래그먼트를 대체합니다. |
remove(Fragment fragment) | 추가된 프래그먼트를 제거합니다. |
commit() | 화면에 적용합니다. |
프래그먼트 생명주기
프래그먼트는 액티비티처럼 동작하는 뷰입니다. 그러므로 액티비티에 작성하는 코드는 모두 프래그먼트에도 작성할 수 있습니다. 따라서 액티비티와 생명주기가 같습니다.
액티비티의 생명주기 함수인 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestory()를 그대로 가지고 있으며 호출되는 시점도 액티비티와 같습니다.
초기화(initialized), 생성(created), 시작(started), 재개(resumed), 소멸(destroyed) 단계로 구분합니다.
백 스택은 프래그먼트가 화면에 보이지 않는 순간 제거하지 않고 저장했다가 다시 이용할 수 있는 기능을 말합니다. 백 스택을 사용하지 않으면 프래그먼트가 교체될 때 기존의 프래그먼트는 onDetory까지 호출되어 제거됩니다. 백 스택을 사용하면 프래그먼트가 제거되지 않고 onDestoryView 함수까지만 호출됩니다.
이러한 백 스택을 이용할 것인지는 FragmentTransaction의 addBackStack() 함수로 설정 가능합니다.
백 스택 사용 설정
transaction.addToBackStack(null)