반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

[CookBook] Fragments 이해하기 -4-

2013. 9. 27. 22:06 | Posted by 솔웅


반응형

Understanding the Role of FragmentManager and FragmentTransaction in Handling Fragments




FragmentManager는 이름 그대로 액티비티 내에서 fragments를 관리하는데 사용됩니다. 액티비티에서 사용 가능한 fragment에 접근할 수 있게 해 주고 fragments를 추가하거나 제거하거나 재배치할 필요가 있을 때 FragmentTransaction을 사용합니다. FragmentManager에 접근하려면 getFragmentManager() 메소드를 사용합니다.



FragmentManager fragmentManager = getFragmentManager();



fragment transaction을 사용하려면 FragmentTransaction의 인스턴스를 사용합니다.


FragmentTransaction fragmentTransaction = fragmentMaanger.beginTransaction();




새로운 FragmentTransaction은 FragmentManager의 beginTransaction() 메소드를 사용해서 생성합니다.



private static final String TAG1 = "1";
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment1Activity fragment = new FragmentActivity();
fragmentTransaction.add(R.id.fragment_container, fragment, TAG1);
fragmentTransaction.commit();


여기 보시면 Fragment1Activity는 fragment의 자바 클래스입니다. 이것은 XML 파일로부터 fragment의 UI를 로드해서 사용하죠. 밑에서 두번째 줄을 보시면 fragment_container가 id라는 걸 알 수 있을 겁니다. 아마 이 id는 LinearLaout이나 FrameLayout 일 거라고 예상할 수 있을 겁니다. 그리고 commit()메소드가 보이는데요. 이것은 변화된 사항을 적용하기 위해 사용하는 메소드 입니다. 이 commit()은 즉시 발효되는 것은 아니고 쓰레드가 준비 됐을 때 발효가 될 겁니다. 그러니까 방금 생성한 fragment에 대한 reference를 곧바로 get하는 것은 문제가 생길 수 있습니다.



Note
fragment를 dynamic 하게 추가하려면 container view는 fragment 가 display될 view 가 있는 layout에 존재해야 합니다.



fragment를 추가하기 전에 이것이 존재하는지 확인할 필요가 있을 겁니다. 아래처럼 하시면 됩니다.



private static final String TAG1 = "1";
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if(null == fragmentManager.findFragmentByTag(TAG1)){
    Fragment1Activity fragment = new Fragment1Activity();
    fragmentTransaction.add(R.id.fragment_container, fragment, TAG1);
}
fragmentTransaction.commit();



FragmentManager의 findFragmentByTag() 메소드가 주어진 tag의 fragment가 있는지 여부를 체크 하고 있습니다. 이 findFragmentById() 메소드는 activity layout 에 추가된 fragment를 identify 합니다. 아니면 findFragmentByTag() 메소드를 사용할 수도 있습니다. 위에 있는 Fragment1Activity는 fragment의 layout 파일에서 정의된 view들이 로드되는 자바 클래스 입니다.



fragment나 content를 replace하기위해 FragmentTransaction의 replace()메소드를 사용합니다.



private static final String TAG2 = "2";
fragmentTransaction.replace(R.id.fragment_container, fragment2, TAG2);



여기 보시면 fragment2의 view는 액티비티 layout의 fragment_container안에있는 view를 다시 replace할 겁니다. fragment를 없애려면 findFragmentById()나 findFragmentByTag()메소드를 사용해서 그 fragment 구분해 내야 합니다. 아래 코드는 findFragmentById()메소드를 사용해서 fragment를 정의하고 그 fragment를 remove 하는 과정을 보여줍니다.


FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment);
fragmentTransaction.remove(fragment);
fragmentTransaction.commit();



위에 보시면 없애고자 하는 fragment를 정의하기 위해 findFragmentById()를 사용하신 걸 보실 수 있습니다. 이것을 findFragmentByTag()를 사용하시려면 아래와 같이 사용하실 수 있습니다.
Fragment fragment = fragmentManager.findFragmentByTag(TAG1);

반응형