>> 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 |