FragmentTransaction의 replace() 메소드를 통해 동적으로 Fragment 교체하기

교체하는 코드는 다음과 같다.


FragmentManager fragmentManager =
                                       getFragmentManager();
FragmentTransaction fragTransaction = 

                          fragManager.beginTransaction();
MyFragment mFrag = new MyFragment();

fragTransaction.add(R.id.layout, mFrag);

//아래 코드 실행되는 시점에 

//MyFragment가 비로소 실행된다.

fragTransaction.commit(); 



☞ FragmentManager

⇒ Activity안에 있는 Fragment와 상호 작용 및 관리(Activity에 추가, 교체...)를 위한 클래스

이 클래스의 객체는 Activity의 메소드 중 getFragmentManager()를 통해 얻을 수 있다.


☞ fragTransaction.add(R.id.layout, mFrag);

⇒ 새로운 Fragment인 mFrag를 R.id.layout이라는 곳에 추가하는 기능.

R.id.layout이 들어있는 xml파일이 다음과 같다면


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

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:id="@+id/layout"

    android:orientation="vertical" >


    <Button

        android:id="@+id/btn"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:textSize="30sp"

        android:text="확 인"

        android:onClick="mClick"

        />

</LinearLayout>



fragTransaction.add(R.id.layout, mFrag)과 유사한 것이 replace() 메소드이다.

아래 코드는 R.id.content_frame에 있는 기존의 Fragment를 제거한 후 

두 번째 매개인자인 fragment를 R.id.content_frame에 집어 넣는 기능이다.


fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();




Fragment를 사용하기 위해서 개념을 정리해 보았다.


Fragment를 사용하는 건 사용자에겐 편리할지 모르나 개발자에겐 좀 복잡한 작업이다.
특히 Fragment와 ViewPager와 ActionBar와
DrawerLayout이 함께 엮이어 돌아갈 경우는 더더욱 머리가 복잡해 진다. 따라서 전체적인 개념이 정리가 필요하다. 

본 포스트는 Fragment를 기본적으로 사용해 본 경험이 있는 분들이라야 의미가 있으리라고 생각된다.

아래는 Fragment의 동작 메커니즘을 정리해 본 내용이다.


-. Activity가 Fragment를 담기 위해서는 일반 Activity로는 안되고 android.support.v4.app.FragmentActivity를 extends해야한다.

   public class ExViewPagerActivity extends FragmentActivity { ... }


-. 여기서 Fragment간의 이동을 부드럽게 되도록 해 주는 용도로 ViewPager를 채용하면된다.
   즉 FragmentActivity에 ViewPager를 담으면 된다.

   ViewPager는 Layout manager that allows the user to flip left and right through pages of data의
   역할을 한다.


-. ViewPager에 담을 데이터와 ViewPager에 보여줄 View를 생성하기 위해서는 adapter 클래스가 있어야 한다.
   마치 ListView에 표시할 데이터와 표현하는 방식(View)를 제공하는 역할의 adapter를 필요로 하는 것과 같다. 


-. ViewPager가 사용할 adapter 클래스는 두 가지 종류가 있는데 FragmentPagerAdapter와
    FragmentStatePagerAdapter가 있다.


-. FragmentPagerAdapter는 표시할 page의 수가 고정되어 있고 몇개 되지 않을 때 사용하는 용도이고
   (이 adapter를 사용하면 모든 page를 메모리에 다 로드해 두고서 page 이동을 하는 방식이다)


-. FragmentStatePagerAdapter는 표시할 page의 수가 고정되어 있지않고 또 많을 경우에 사용하는
   adapter이다. 이 경우의 page 이동은 매번 현재 page를 destroy한 후 새 page를 생성하는 식이다. 


-. 이 두 adapter 클래스를 상속받은 클래스는
   public int getCount()과
   public Fragment getItem(int position)를 필요에 맞게 재정의해서 사용하면된다.


-. ViewPager를 setAdapter() 할때 getCount()와 getItem()이 차례로 호출된다.

   public void setAdapter (PagerAdapter adapter)


-. getCount()는 page의 갯수가 몇 개인지를 알려주는 기능이고 getItem()은 adapter에게 ViewPager에
   공급할 Fragment를 반환(제공)해 주는 역할을 한다.




+ Recent posts