Android

Android - Fragment (플래그먼트)

TechNote.kr 2016. 1. 4. 23:48
728x90

Fragments


Fragment는 사용자 UI를 나타낼수 있는 하나의 Activity내의 모듈을 의미한다.

여러 Fragment가 모여 하나의 Activity를 구성하기도 하고, 

하나의 Fragment가 여러 Activity에 사용되기도 한다.


Activity내에 포함되는 모듈이다 보니 기본적으로 Activity의 Lifecycle을 따르게 되는데,

예를 들어, Activity가 pause되면 fragment 또한 pause되고, Activity가 소멸되면 fragment 또한 소멸 된다.

단지, Activity가 resumed 된 상태에서는 fragment 나름의 lifecycle을 가지게 된다.


Fragment 추가 방법 in Activity


Activity에 fragment 삽입하는 방법은 layout xml내에서 <fragment> 요소를 선언하거나

code상에서 ViewGroup 에 추가하면 된다.


[Layout XML에 추가]

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="horizontal"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <fragment android:name="com.example.TestFragment"

            android:id="@+id/test"

            android:layout_weight="1"

            android:layout_width="0dp"

            android:layout_height="match_parent" />

</LinearLayout> 


[Code상에서 추가]

FragmentManager fragmentManager = getFragmentManager()

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();


ExampleFragment fragment = new ExampleFragment();

fragmentTransaction.add(R.id.fragment_container, fragment);

fragmentTransaction.commit();



Fragment Transaction(추가,삭제 등) 수행


Fragment의 장점은 UI를 고정해서 사용자에게 제공하는 제약에서 벗어나, 사용자의 input에 따라 상호작용하여 실시간으로 UI가 추가되거나 제거되는 등의 효과를 나타낼 수 있다는 것이다. 

이런 Activity내에서 변경되는 내용의 집합을 Transaction이라고 한다.


즉, 사용자가 하나의 Activity 내에서 fragment를 추가하고 삭제하는 등의 변경 사항을 Transaction 이라고 칭함.


해당 수행은 FragmentTransaction API를 통해서 할 수 있는데, 해당 FragmentTrasaction은 FragmentManager로 부터 가져올 수 있다.


FragmentManager fragmentManager = getFragmentManager();

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();


이렇게 구해진 fragmentTransaction 에 add(), remove(), replace()와 같이 원하는 동작설정을 진행하고 

마지막에 commit()을 호출하게 되면 fragment transaction이 수행되게 된다.


다만 commit() 이전에 addToBackStack()을 수행해야지만 BackStack 에 저장이 가능하고, 사용자가 Back key를 통해 이전 fragment 상태로 돌아갈 수 있게 된다.


Fragment newFragment = new ExampleFragment();

FragmentTransaction transaction = getFragmentManager().beginTransaction();


transaction.replace(R.id.fragment_container, newFragment);

transaction.addToBackStack(null);

transaction.commit(); 



Acvitiy와 Fragment간의 통신


 Activity와 Fragment의 경우 각자 독립적인 객체로 구현이 되어 있기 때문에 상호간의 Access를 하기 위해서는 다음과 같은 코드가 필요하다


Fragment ---(access)---> Activity

View listView = getActivity().findViewById(R.id.list); 


Activity ---(access)---> Fragment

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 



Fragment Lifecycle


Fragment에도 Activity와 마찬가지로 3가지 상태가 존재한다.


Resumed : 실행 중인 Activity 상에서 표시되는 상태

Paused : 해당 Fragment 위에 다른 Activity가 표시된 상태로 부분적으로는 불투명하게 보이는 상태

Stopped : 다른 Activity가 덮어버려 전혀 보이지 않는 상태


Activity의 Lifecycle과 상당히 유사하지만 자동으로 BackStack에 저장되는 Activity와 달리 Fragment의 경우 addToBackStack()을 통해 명시적으로 요청하여야 한다.


onAttach() : Acitivity에 Fragment를 add할 때 호출

onCreateView() : Fragment에 View관련 계층을 생성하기 위해 호출

onActivityCreated() : Activity의 onCreate()가 수행되면 이후에 호출

onDestroyView() : Fragment에 View관련 계층을 제거하기 위해 호출

onDetach() : Activity에서 Fragment를 제거할 때 호출


나머지 onStart(), onResume(), onPause(), onStop() 의 경우 Activity Lifecycle에 연동되어 수행






728x90