Fragment

concept, life cycle

 

 

[ Fragment Concept ]

 

Fragment는 스마트폰(Smart Phone)이 아닌, 스마트폰 보다는 조금 더 큰 탭이나 태블릿의 화면을 좀 더 효율적으로 사용하기 위해 등장한 안드로이드 API 중 하나입니다. 태블릿이 활성화되기 전에 스마트폰만 사용할 때는 Activity만으로 화면제어가 충분했지만, 갤럭시 노트(Galaxy Note)나 갤럭시 탭(Galaxy Tab)처럼 화면이 큰 디바이스들이 등장하면서 Activity 하나로는 화면의 UI를 제어하기가 불편해진 것이죠. 그래서 Android는 하나의 화면 단위인 Activity를 조금씩 쪼개서 부분별로 제어를 가능하게 할 수 있는 Fragment를 제공하기 시작했습니다.

 

처음에는 Fragment가 태블릿같은 큰 화면 내에서 부분별로 나뉘어서 UI를 제어하기 위해 제공된 것이지만, 스마트폰에서는 작은 화면을 더 작게 나뉘기에는 효율적이기 않았기 때문에 조금 다른 방식으로 사용됬습니다. 화면을 여러 개로 만들고 이들을 겹쳐서 사용하는 식이었습니다. 그래서 현재, 스마트폰에서 Fragment를 사용하는 경우 탭(Tab)으로 사용되는 경우가 많습니다. 예를 들면, 카카오톡(Kakao Talk)의 UI가 탭으로 생긴 것처럼 말이죠.

 

앞 설명처럼 Fragment는 Activity를 부분적으로 나뉘어서 만들어진 것이기 때문에, Fragment는 Activity에 의존적일 수 밖에 없습니다. 그래서 Fragment는 Activity가 존재해야만 존재할 수 있고, Fragment의 생명주기(Life Cycle) 또한 Activity의 생명주기에 의존적이게 되는 것입니다.

 

만약, 웹(Web)을 개발해본 경험이 있다면, 웹의 화면을 부분적으로 나누기 위해 <frame>이나 <div> 태그를 사용해본 경험이 있을 것입니다. 예를 들어, 웹 사이트를 만들 때 화면의 일부분은 광고, 일부분은 뉴스, 일부분은 쇼핑목록 등으로 출력시켜야하는 경우 사용할 수 있을 것입니다. 웹에서 이렇게 사용되는 HTML의 <frame>이나 <div> 태그가 태블릿에서의 Fragment 역할을 하는 것이고, HTML 태그 속성 중 화면에서 사라지게 만드는 “display” 속성이 스마트폰에서의 Fragment 역할을 하는 것이라고 말할 수 있습니다.

 

 

 

Fragment Life Cycle (생명주기)

 

[ Fragment Life Cycle]

 

Fragment가 보여지기까지 호출되는 함수 순서

  1. onAttach() : FragmentActivity에 붙을 때 호출
  2. onCreate() : Fragment가 생성될 때 호출 (=UI 작업 불가능)
  3. onCreateView() : FragmentUI를 그리기 위한 View가 생성될 때 호출
  4. onActivityCreated() : 보통 잘 사용하지 않는다. (ListFragment를 활용할 때 주로 사용)
  5. onStart() : Fragment가 화면에 표시될 때 호출 (=사용자 상호작용 불가능)
  6. onResume() : Fragment의 포커스가 잡힐 때 호출 (=사용자 상호작용 가능)

 

Fragment가 가려지기까지 호출되는 함수 순서

  1. onPause() : Fragment의 포커스가 없어질 때 호출
  2. onStop() : Fragment가 화면에서 사라질 때 호출
  3. onDestroyView() : FragmentView가 제거될 때 호출
  4. onDestroy() : Fragment가 제거될 때 호출
  5. onDetach() : FragmentActivity에서 떼어질 때 호출

 

 

Fragment Sample Code (기본 구성)

 

[ Fragment 구성 ]

 

아래는 스마트폰위에서 Fragment를 사용해서 개발하는 경우 사용될 수 있는 기본 구성 중 하나입니다. 설명하는 코드는 총 4개의 파일로 구성되어 있습니다. 우선, 하나의 Activity 만든 후, 그 안에 하나의 Fragment 를 만드는 코드입니다.

 

  • MainActivity.java (=Activity)
  • activity_main.xml (=Activity 레이아웃)
  • MainFragment.java (=Fragment)
  • fragment_main.xml (=Fragment 레이아웃)

 

MainActivity.java

package com.joker;

public class MainActivity extends AppCompatActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
}

 

activity_main.xml

<RelativeLayout ...>
	<fragment
	class="com.joker.MainFragment"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	tools:layout="@layout/fragment_main"
	... />
</RelativeLayout>

 

MainFragment.java

package com.joker;

public class MainFragment extends Fragment {
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.fragment_main.xml, container, false);
		return v;
	}

	@Override
	public void onViewCreated(View view, Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);
	}

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	@Override
	public void onDestroyView() {
		super.onDestroyView();
	}

	@Override
	public void onDetach() {
		super.onDetach();
	}

	@Override
	public void onPause() {
		super.onPause();
	}

	@Override
	public void onResume() {
		super.onResume();
	}

	@Override
	public void onStart() {
		super.onStart();
	}

	@Override
	public void onStop() {
		super.onStop();
	}
}

 

fragment_main.xml

<LinearLayout ...>
</LinearLayout>

 

 

참고

(Android Developer) Fragment 설명

https://developer.android.com/guide/components/fragments