레이블이 탭구성인 게시물을 표시합니다. 모든 게시물 표시
레이블이 탭구성인 게시물을 표시합니다. 모든 게시물 표시

2019년 5월 14일 화요일

안드로이드 Fragment Tab 예제

- Fragment를 활용한 탭 예제


0. 탭 화면을 구성할 때 주의사항.
네비게이션 흐름상 ListFragment에서 ListItemFragment로 이동해야 하는 경우

getSupportFragmentManager().beginTransaction().replace(R.id.tab_container, ListItemFragment.newInstance()).commit();

형태로 사용하는 경우가 종종 있지만

Tab 내에서 UI 이동이 발생하면 Fragment 흐름을 관리하기 어렵다.
Tab을 사용할 때는 Activity로 List 항목을 표현하는 것을 추천.



1. 탭 구성
Tab1Fragment, Tab2Fragment, Tab3Fragment를 생성한 뒤

FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.findFragmentById(R.id.tab_container) == null) {
Tab1Fragment tab1 = Tab1Fragment.newInstance("Home Tab");
Tab2Fragment tab2 = Tab2Fragment.newInstance("Dash Board Tab");
Tab3Fragment tab3 = Tab3Fragment.newInstance("Notification Tab");
fragmentManager.beginTransaction()
.add(R.id.tab_container, tab1, tab1.getClass().getSimpleName()).show(tab1)
.add(R.id.tab_container, tab2, tab2.getClass().getSimpleName()).hide(tab2)
.add(R.id.tab_container, tab3, tab3.getClass().getSimpleName()).hide(tab3).commit();
}

첫번째 탭만 show를 하고 나머지 탭은 모두 hide 처리
Activity의 onCreate에서 위 코드를 적용하면 FragmentManager에 적용된 순서와 동일하게
onCreate > onCreateView > onResume
상태가 된다.





2. Tab 이동
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
List<Fragment> fragments = fragmentManager.getFragments();
for (Fragment item : fragments) {
if (item.getClass().getSimpleName().equals(tabName)) {
beginTransaction.show(item);
} else {
beginTransaction.hide(item);
}
}
beginTransaction.commit();

getFragments 메소드를 통해서 현재 탭을 모두 가져와서 보여질 Fragment만 show 처리하고 나머지 Fragment는 모두 hide 처리한다.




3. 탭 데이터 갱신
동일한 탭 또는 다른탭을 선택 했을 때 Fragment 내용을 변경해야 한다면 인터페이스를 적용해서 데이터를 갱신한다.

- 인터페이스
public interface OnDataUpdate {

    /**
     * 데이터 갱신
     */
    void onUpdateData();
}


- 인터페이스 구현
public class Tab1Fragment extends Fragment implements OnDataUpdate {
    
    @Override
    public void onUpdateData() {
        Log.d("Fragment", text + " : onUpdateData");
        count++;
        TextView textView = getView().findViewById(R.id.text);
        textView.setText(String.format("%s %d", text, count));
    }
}


- 데이터 갱신
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
List<Fragment> fragments = fragmentManager.getFragments();
for (Fragment item : fragments) {
if (item.getClass().getSimpleName().equals(tabName)) {
beginTransaction.show(item);

/*보여질 탭 갱신*/
if (item instanceof OnDataUpdate)
((OnDataUpdate) item).onUpdateData();

} else {
beginTransaction.hide(item);
}
}
beginTransaction.commit();

OnDataUpdate 인터페이스를 구현한 Fragment를 instanceof로 체크한 다음 onUpdateData를 호출해서 show가 되는 Fragment를 갱신한다.




4. 샘플코드
소스코드
APK