Activity와 Fragment, body와 div

안드로이드 버전 3.0(허니콤브, 2011 출시) 부터 지원하기 시작한 Fragment는

타블렛을 위해서 처음 고안되었다고 한다.

원래 하나의 Activity에서 하나의 화면을 독립적으로 구현해왔었지만,

화면이 큰 타블렛에서 효율적으로 공간을 활용해야하다보니 하나의 화면에

하나의 Activity로 각각 따로 구현하는 것은 문제가 있었던 것 같다.

Fragment에 대해서 처음에는 이해가 잘 가지 않았는데, 이해하기 쉽게 웹페이지에

연관시켜보았다.

웹페이지(HMTL)에도 body 태그 안에서 하나의 화면이 그려지긴 하지만,

결국 div라는 영역으로 모달창을 미리 만들어 두었다가 필요할 때 display 시키는

것처럼, fragment도 자주쓰는 화면일 경우에, 필요한 activity에서 가져다가 쓰는

개념으로 이해할 수 있었다.

즉, A라는 activity에서 a 라는 Fragment와 b 라는 fragment를 사용한다면,

B라는 activity에서는 b Fragment와 c Fragment를 사용하여 뷰를 구현할 수 있는 것이다.

Fragment 개념이 없을 때에는 A activity와 B activity의 코드 중복이 많았겠지만,

Fragment를 사용하면 중복을 줄이기도 좋고, 기능을 모듈화 시키기 때문에 유지보수하기도

수월 것으로 생각한다.

Fragment의 사전적인 의미가 조각, 일부분이라는 뜻인 것으로 유추해봤을 때,

타블렛 화면에서 하나의 화면을 통째로 activity로 표현하는 것보다

여러 개의 fragment로 쪼개어서 재사용을 하기 좋게 만드는 용도인 듯 하다.

꼭 타블렛이 아니더라도, 요즈음 대부분의 스마트폰이 FHD 이상의 디스플레이를

가지기 때문에, fragment를 사용하여 개발하는 것은 필수라고 생각된다.

팝업창, 광고영역, 메뉴영역 등을 fragment로 만들어두면 공통적으로 사용하기 좋을듯 하다.

공부를 더 한 후 내용을 추가하는게 좋겠다.

fragment 사용하기

출처 : https://developer.android.com/guide/components/fragments.html?hl=ko

fragment는 onCreate(), onCreateView(), onPause() 같은 수명주기 메서드를 구현해주어야한다.

Activity와 비슷하지만, Activity에 종속적이다.

마치 Process와 Thread가 생각나는 대목이다.

Thread는 경량화된 Process다. 라는 말처럼,

Fragment는 경량화된 Activity다. 라는 생각이 든다.

생각해보니 하나의 process내에서 multi thread를 구현하는 것처럼

하나의 activity에서 여러 개의 fragment를 사용하는 것도 비슷한 느낌이다.

HTML의 body, div 관계와 Program의 process, thread 관계를 조금씩 가지고 있는

Activity, fragement는 다음과 같이 사용한다.

public static class ExampleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.example_fragment, container, false);
    }
}

fragment를 만든다.

<?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.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

Activity의 xml에 fragment를 추가한다.

또는 activity에 직접 코드로 작성할 수도 있다.

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

fragment와 activity간 통신하기

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

위와 같이 fragment에서 액티비티의 요소에 접근이 가능하다.

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

마찬가지로 액티비티에서도 프래그먼트의 메서드에 접근이 가능하다.

fragment를 구현할 때 더 공부를 해야할 것 같기에

구글에서 제공하는 가이드 문서를 남겨 놓는다.

https://developer.android.com/guide/components/fragments.html?hl=ko