Android.app.Fragment
Fragment는 Activity 내부에서 UI나 프로세스를 정의할 수 있는 더 작은 단위이고, 하나의 Activity에 다수의 Fragment를 배치하거나 여러 개의 Activity에서 하나의 Fragment를 재사용하는 것이 가능하다. 따라서 Fragment는 Activity를 구성하는 작은 모듈이라고 생각하면 되며, Activity와는 별도의 라이프사이클과 이벤트 또한 따로 처리가 가능하고, 하나의 Activity가 실행되고 있을 때 유동적으로 추가하고 삭제가 가능하도록 되어있다.
Fragment는 허니콤(안드로이드 3.0, API level 11)에서부터 태블릿을 위한 UI 개발 방법 디자인으로 소개되었고 다양한 사이즈의 화면에 대하여 더 많은 UI를 보여주거나 일을 처리할 수 있도록 앱의 UI 디자인을 도와준다. Fragment는 Activity의 레이아웃을 부분부분 나눠서 개발자가 다른 크기의 화면에서 개발할 때 View의 구조를 복잡하게 수정하지 않아도 쉽게 재사용할 수 있도록 도와준다. 이렇게 Activity를 여러 모듈들로 나눔으로써 Activity는 런타임 동안 레이아웃을 유동적으로 바꿀수도 있고 백스택에 그 변화를 저장하여 백 버튼과의 연동 또한 쉽게할 수 있게 된다.
Fragment Lifecycle
Fragment_lifecycle.png
프라그먼트(Fragments)의 특징
- 프래그먼트는 액티비티 조각 혹은 서브액티비티(subactivity).
- 하나의 액티비티에서 다수의 프래그먼트를 결합하여 다중 패널multi-pane UI를 생성할 수 있음.
- 여러 액티비티에서 하나의 프래그먼트를 재활용 가능.
- 프래그먼트 자신만의 생명주기 가짐.
- 입력 이벤트를 받아들이며, 액티비티가 실행하는 동안 동적으로 추가 혹은 삭제 가능.
- activity 안에서만 존재할 수 있고 단독으로 존재할 수 없다.
- activity 안에서 다른 view와 함께 존재 가능.
- back stack을 사용가능.
- 반드시 default 생성자 존재.
What is FragmentTransaction?
Fragment Transaction에 대한 설명.
-
add(int, Fragment, String)
- FragmentManager에 Fragment가 추가 된다.
-
remove(Fragment)
- 해당 fragment가 존재할 경우 제거 한다. FragmentManager에서 더이상 찾을 수 없다.
-
hide(Fragment)
- 해당 fragment가 존재할 경우 숨긴다. FragmentManager에 관리 되어지며, 추후 show를 통해 다시 보여줄 수 있다.
-
replace(int container, Fragment, String tag)
- container 안에 tag 명으로 존재하는 fragment를 remove(Fragment) 한 후에 같은 태그명으로 Fragment를 add(int,Fragment, tag)를 호출한다. 한마디로 container 안에 tag명 fragment를 remove 후에 add 한다.
-
detach(Fragment)
- 해당 fragment가 존재할 경우 떼어낸다. remove 와 다른 점은 remove의 경우 FragmentManager 안에서 완전히 제거되지만 detach 의 경우 stack에 존재한다. 추후 attach 를 호출할 경우 다시 보여줄 수 있지만 View 계층에서 다시 생성되기 때문에 remove 와 별 차이가 없어 보인다.
-
attach(Fragment)
- 해당 Fragment 가 존재할 경우 다시 View 계층도에 붙인다.
-
setCustomAnimations(int enter, int exit, int popEnter, int popExit)
- Fragment 의 entering and exiting animation 명시. popEnter, popExit animations 은 back stack 에서 pop 될 떄 진행될 animation을 명시한다.
프라그먼트 보이기/숨기기
Fragment를 보여줄 때는 아래와 같이 한다.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.show(fragment);
ft.commit();
Fragment를 숨길 때는 아래와 같이 한다.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.hide(fragment);
ft.commit();
또한 어떤 애니메이션을 줄때는 아래와 같이 한다.
와 같은 형태로 커스터마이징이 가능하다.
Example
프로그래밍으로 Fragment를 추가하는 방법은 아래와 같다.
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
특정 Layout 리소스를 지정한 Fragment로 변경하는 방법은 아래와 같다.
Fragment fragment = new Fragment;
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit();
UI 없이 Fragment 추가하기
UI가 없는 Fragment를 추가하기 위해서는 View에 설정하는 ID가 없기 때문에 tag를 통해 설정한 ID를 통해서 Fragment를 찾아서 추가해야하는데, 이때에 FragmentTransaction.add(Fragment, String)
함수를 사용하면 된다. 이 때 두번째 인자는 Fragment의 tag로 고유한 스트링 ID를 부여하면 된다. 이 함수를 활용해서 Fragment를 추가하는 경우 Activity의 View와 연동되지 않았기 때문에 Fragment의 onCreateView()
함수가 호출되지 않으므로 이 함수를 구현할 필요가 없다.
tag를 이용한 ID의 할당은 UI가 없는 Fragment에 제한되지 않고 UI가 있어도 tag를 통한 스트링 ID를 부여할 수도 있지만 UI가 없다면 오로지 tag를 이용해서 스트링 ID를 할당해야 Activity 로부터 Fragment를 찾을 때 findFragmentByTag()
함수를 활용할 수 있다.
Favorite site
- Fragment class reference
- Android developer site: Fragments
- [추천] 안드로이드: 프로그먼트(fragment) 1
- Android 화면분할(Fragment)
- [추천] Android 앱 개발 기초 Fragment 기초 2
- [추천] Android 개발시 Fragment 를 이용해서 화면 구성하기 - 1. Fragment 생명주기
- 안드로이드 - Fragment에서 ViewPager 사용하기
- [추천] Fragment의 특징
- Fragment animation 정의하기 팁#1
- Android Fragment 에 대하여
- Fragment의 특징
- 안드로이드 앱 개발 기초: Fragment 기초 3
- [추천] [https://academy.realm.io/kr/posts/michael-yotive-state-of-fragments-2017/? 프래그먼트: 안드로이드의 모든 문제의 해결책이자 원인]