FileListActivity 를 fragment 로 만드는 과정
결과 소스 : http://www.mediafire.com/?3gf1n19v3o0z6c2결과 소스에 before/after 가 있으니 compare tool 을 사용해서 확인하면 더욱 이해하기 편할 것이다.
아래 2개의 소스를 fragment 로 변형할 것이다.
- FileListActivity.java
- activity_filelist.xml
방법
- 복사 : FileListActivity.java / activity_filelist.xml 를 복사한다.
- 이름 변경 : FileListActivity.java 를 FileListFragment.java 로 이름을 바꾼다.
- 이름 변경 : activity_filelist.xml 를 fragment_filelist.xml 로 이름을 바꾼다.
- 결과 파일
- FileListActivity.java
- FileListFragment
- activity_filelist.xml
- fragment_filelist.xml
FileListActivity.java
- FragmentActivity 로 변경: extends Activity -> extends FragmentActivity
- fragment tag 추가 : activity_filelist.xml 에 <fragment name="package.FileListFragment" .../> 를 추가하자.
FileListFragment.java
- Fragment 로 변경 : extends Activity -> extends Fragment
- onStart()로 변경 :
- onCreate() 을 onStart() 로 바꾸고,
- super.onCreate() 을 super.onStart() 로 바꾼다.
- setContentView() 삭제
- getActivity() 로 변경 : this 는 getActivity() 로 바꾼다.
- getView() 추가 : findViewById() 앞에는 getView() 를 넣어서 getView().findViewById() 로 만든다.(getView() 는 onCreateView() 에서 inflate 되는 fragment이다.)
- 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
- 화면전환시 설정 값을 유지하는 방법 from http://i5on9i.blogspot.kr/2013/10/blog-post_14.html
- Creating and Using Fragments | CodePath Android Cliffnotes
- dynamic 하게 fragment 를 설정하는 방법
- onAttach / onCreate / onCreateView / onViewCreated / onActivityCreated 에 대한 설명
References
- Chapter 4, Professional Android 4 application development
감사합니다 ^^
답글삭제네, 저도 감사합니다.^^
삭제