본문 바로가기

프로그래밍/Android

Fragment 기본

 

>> Fragment 기본사항

 

1. fragment 만들기

원하는 형태로 layout을 만들어 준다.

Fragment 클래스를 상속받은 클래스를 생성하고, 위 layout을 지정한다.

ex)

@Override

public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate( R.layout.my_fragment, container, false );

    // 필요한 작업

    return view;

}

 

2. fragment 붙이기

activity의 layout에서 <Fragment> 를 사용해 해당 fragment를 붙일 수 있다.

단, 이 경우 임의로 제거나 변경이 불가능하므로 고정된 형태의

경우에만 사용한다.

ex)

<fragment

     android:id="@+id/my_fragment"

     class="com.test.MyFragment"

     android:layout_width="match_parent"

     android:layout_height="match_parent" />

 

 

3. Fragment 동적으로 붙이기

activity의 레이아웃에 fragment가 하위로 추가될 루트 레이아웃이 필요하다.

보통 <FrameLayout>을 사용해 루트를 만들고, 해당 레이아웃을 기준으로

변경이나 삭제가 일어나게 된다.

 

실제 작업은 Activity(3.0이하 버전은 FragmentActivity) 의 

FragmentManager / FragmentTransaction

을 사용해 처리하게 된다.

 

FragmentTransaction에 필요한 작업( 교체,삭제, 추가 등)을 지정하고, 

commint()을 호출해 실제 View에 반영하게 된다.

 

ex) 

activity layout

<FrameLayout

    android:id="@+id/fragment_container"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

/>

 

activity class

@Override

public void onCreate( Bundle savedInstanceState ) {

    .

    .

    FragmentManager fm = getFragmentManager(); // getSupportFragmentManager();

    FragmentTransaction transaction = fm.beginTransaction();

 

    MyFragment frag = new MyFragment();

    // MyFragment.newInstance();

 

    // 추가

    transaction.add( R.id.fragment_container, frag );

 

    // 변경

    // transaction.replace( R.id.fragment_container, frag );

 

    transaction.commit();

}

 

 

>> Tabhost

Tabhost는 탭위젯과 탭 컨텐츠로 구성되는데, 이 컨텐츠에( @android:id/tabcontent)

뷰나 인텐트(activity)를 설정하면, 탭이 변경될때 자동으로 해당 뷰를

보여주게 된다. 

일반적인 레이아웃은 대략 아래와 같은 모습을 가진다.

<TabHost>

   <TabWidget

      android:id="@android:id/tabs" />

 

   <FrameLayout

      android:id="@android:id/tabcontent"  />

</TabHost>

 

Activity를 붙이기 위해서는 

tabHost.setup( getLocalActivityManager() );

tabSpec.setIndicator( ... );

tabSpec.setContent( new Intent(.. ) );

tabHost.addTab( tabSpec);

의 순서로 진행한다.

 

물론, 위의 내용은 deprecate되었으며 fragment는 이 형태로 사용할 수 없다.

fragment는 컨텐츠가 액티비티가 아닌 View 형태로 지정되어야 한다.

 

<TabHost>

   <TabWidget

      android:id="@android:id/tabs" />

 

   <FrameLayout

      android:id="@android:id/tabcontent"  >

      

      <FrameLayout

          android:id="@+id/tab_1" />

 

      <FrameLayout

          android:id="@+id/tab_2" />

   </FrameLayout>

</TabHost>

 

위처럼 fragment가 설정될 레이아웃을 지정해 해당 레이아웃에 fragment를

붙여 사용해도 되고, 아래처럼 기존 컨텐츠 부분을 보이지 않고,

별도의 컨텐츠용 레이아웃을 잡아 tab 변경 이벤트에 따라

fragment를 replace 해주면 된다.

 

<TabHost>

   <TabWidget

      android:id="@android:id/tabs" />

 

   <FrameLayout

      android:id="@android:id/tabcontent"  

      android:layout_width="0dp"

      android:layout_height="0dp"

   />

      

  <FrameLayout

      android:id="@+id/my_tabcontent" />

 

</TabHost>

 

 

tabHost.OnTabChangeListener listener = new TabHost.OnTabChangeListener() {

   @Override

   public void onTabChanged( String tabId ) {

      FragmentManager fm = getSupportFragmentManager();

      FragmentTransaction transaction = fm.beginTransaction();

      if( tabId.equalsIgnoreCase("tab_1" ) {

         

         MyFragment frag = (MyFragment) fm.findFragmentByTag("tab_1");

         if( frag == null ) {

            transaction.add( R.id.my_tabcontent , new MyFragment(), "tab_1");

         } else {

            transaction.replace( frag);

            // transcation.attach( frag); 사용해도 된다.

         }

      } else {

         // 다른 fragment

 

      }

      

      transaction.commit();

 

   }

 

}

 

대략 이런 형태임~

'프로그래밍 > Android' 카테고리의 다른 글

파일 변경 이벤트  (0) 2014.04.01
[안드로이드TV] 개발 전 확인사항  (0) 2014.02.17
GoogleTV 개발환경 설정  (0) 2014.02.06
GCM 메시지 전송  (0) 2013.09.13
Dialog  (0) 2013.02.22
EditText 특수문자 입력 제한  (0) 2012.09.10
앱 연동  (0) 2012.07.27
Parcelable  (0) 2012.05.22
Data Animation???  (0) 2012.04.18
Assets 폴더의 이미지 읽기  (0) 2012.03.15