[컴][안드로이드] Activity 를 Fragment 로 바꾸는 방법

activity 를 fragment 로 바꾸는 과정을 담은 동영상이다. 보면 이해가 훨씬 쉬울 것이다.



FileListActivity 를 fragment 로 만드는 과정

결과 소스 : http://www.mediafire.com/?3gf1n19v3o0z6c2
결과 소스에 before/after 가 있으니 compare tool 을 사용해서 확인하면 더욱 이해하기 편할 것이다.

아래 2개의 소스를 fragment 로 변형할 것이다.
  1. FileListActivity.java
  2. activity_filelist.xml

방법

  1. 복사 : FileListActivity.java / activity_filelist.xml 를 복사한다.
  2. 이름 변경 : FileListActivity.java 를 FileListFragment.java 로 이름을 바꾼다.
  3. 이름 변경 : activity_filelist.xml 를 fragment_filelist.xml 로 이름을 바꾼다.
  4. 결과 파일
    1. FileListActivity.java
    2. FileListFragment
    3. activity_filelist.xml
    4. fragment_filelist.xml

FileListActivity.java

  1. FragmentActivity 로 변경: extends Activity -> extends FragmentActivity
  2. fragment tag 추가 : activity_filelist.xml 에 <fragment name="package.FileListFragment" .../> 를 추가하자.

FileListFragment.java

  1. Fragment 로 변경 : extends Activity -> extends Fragment
  2. onStart()로 변경 :
    1. onCreate() 을 onStart() 로 바꾸고,
    2. super.onCreate() 을 super.onStart() 로 바꾼다.
    3. setContentView() 삭제
  3. getActivity() 로 변경 : this 는 getActivity() 로 바꾼다.
  4. getView() 추가 : findViewById() 앞에는 getView() 를 넣어서 getView().findViewById() 로 만든다.(getView() 는 onCreateView() 에서 inflate 되는 fragment이다.)
  5. onCreateView() 추가 :
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
     
     return inflater.inflate(R.layout.fragment_filelist, container, false);
    }
    
    

    onCreateView() 에선 Fragment 를 초기화하는 데 필요한 요소를 넣으면 된다. UI를 inflate 하거나, Fragment 에서 사용할 Service 나 Timer 등을 여기서 만들면 된다.

    onStart() 에 넣을 수 있다면, onStart() 가 좋을 수도 있다. onCreateView() 에 넣으면, 다 그려지기 전까지는 화면에 보이지 않을 수도 있다.(확인필요)

    그러므로 화면이 바뀌어서 다시 돌아오게 되면 onCreateView() 부터 시작하게 된다. 화면이 바뀌게 되면, 이 화면을 다시 그려야 하기 때문에 inflate 를 해줘야 한다. 그러니 이부분에는 화면을 inflate 하는 부분을 넣어줘야 한다.

    근데, 만약에 Activity에 관련있는 값을 필요로 할 때는 onActivityCreated() 에서 처리해야 한다. onActivityCreated() handler 는 Activity 의 초기화, UI 생성이 다 된 후에 호출되는 녀석이기 때문이다. 

Fragment 와 Activity

Fragment 가 inflated 되고 나면, Fragment 가 Activity 안에 들어가게 된다.(Activity의 View hiearchy 의 일부가 된다.) 그러므로 Activity.findViewById()를 이용해서 찾을 수 있다.


getActivity()

getActivity()를 통해서 Fragment 가 속해있는 Activity(host Activity)의 reference 를 얻을 수 있다. 그래서 아래와 같은 것들에 이용할 수 있다.

  • Context 찾을 때
  • 다른 fragmentManager 를 이용해서 다른 fragment 를 찾을 때
  • Activity's View hierarchy 안에 있는 View 들을 찾을 때

ref. 1 에 따르면,
host Activity 의 FragmentManager 를 이용해서 Fragment 는 직접통신하는 것이 가능하지만 일반적으로 Activity 를 중개자로 이용하는 것이 나은 방법이다.

라고 한다. 이를 통해서 Fragment 가 가능한 독립적이고, loosely coupled 되게 해준다고 하는데, FragmentManager.findFragmentById(int) 를 쓰지말고, getAcitivity().findViewId()(물론 getView().findViewId() 이지만, 그냥 굳이 예를 든다면) 를 사용하는 것이 낫다고 얘기하는 건가?



See Also

  1. 화면전환시 설정 값을 유지하는 방법 from http://i5on9i.blogspot.kr/2013/10/blog-post_14.html
  2. Creating and Using Fragments | CodePath Android Cliffnotes
    1. dynamic 하게 fragment 를 설정하는 방법
    2. onAttach / onCreate / onCreateView / onViewCreated / onActivityCreated 에 대한 설명




References

  1. Chapter 4, Professional Android 4 application development


댓글 2개: