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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

[CookBook] Fragments 이해하기 -1-

2013. 9. 25. 21:58 | Posted by 솔웅


반응형

Fragments



이번에는 Fragments에 대해서 배워보겠습니다. 안드로이드 어플리케이션은 때때로 fragments로 나눠지기도 하는데요 좀 더 manageable 하다는 얘기죠. fragment들은 각각 독립적으로 유저 인터페이스를 진행하고 또 쉽게 어플리케이션에서 추가나 삭제도 가능하고 서로 다른 화면 크기에 맞게 세팅을 할 수도 있습니다. 바로 이런 작업을 하능하게 하는 fragment를 사용하는 법과 그 life cycle에 대해 배우겠습니다. 그리고 이 fragment가 실제 안드로이드 어플리케이션에는 어떻게 적용 되는지도 알아 보구요. 또 자바 코드에서 어떻게 이 fragment들이 dynamic하게 추가 되는지도 알아 봅니다. 그리고 두개의 fragment 사이에서 어떻게 data를 넘겨주고 받는지도 보구요. ListFragment, DialogFragment, PreferenceFragment 들에 대해서도 다룹니다.



이 기능은 타블렛을 위해 나온 기능 입니다. 화면이 큰 타블렛의 공간을 나눠서 활용하기 위해 이 개념이 나왔는데요. 그러니까 7인치나 10인치 타블렛이 이 기능을 적용하기에 적합합니다.



이 글에서 소개 되는 어플리케이션은 아래 구조를 따릅니다.



1. res/values 폴더 밑에 dimens.xml 이라는 이름으로 아래 내용을 넣습니다.
  
2. res 폴더 밑에 values-sw600dp 와 values-sw720dp 라는 폴더를 생성합니다. 그리고 1번의 dimens.xml을 이 폴더 밑에 복사해 넣습니다.


3. 이 dimens.xml 파일 안의 text_size를 values-600dp 안에 있는 것은 24sp 로 values-720dp 안에 있는 것은 32sp 로 수정합니다.



Introducing Fragments



Fragments 는 activity 를 encapsulated 된 재사용 가능한 모듈로 나눕니다. 각각은 각각의 user interface 를 가지고 있습니다. 어플리케이션을 서로 다른 화면 크기에도 적당하게 표시되도록 할 수 있습니다. 그리고 activity 에서 이 fragments를 추가하거나 삭제 할 수도 있습니다.



디바이스 방향이 portrait 에서 landscape 로 바뀔 때 높이와 너비가 바뀌게 됩니다. 너비가 더 넓어 져서 오른쪽에 더 많은 공간이 생기게 되죠. 높이는 더 짧아져서 아랫쪽에 있는 부분은 짤릴겁니다. 같은 tablet이라도 이렇게 가로방향이냐 세로 방향이냐에 따라서 화면 크기가 다릅니다.



어플리케이션을 개발할 때 유저가 가로방향으로 볼 때와 세로 방향으로 볼 때 모두 어색함이 없도록 그 화면을 구성하는 view들의 구성을 미리 다 마련해 놓아야 합니다. 이럴 때 fragments를 활용할 수 있습니다.


fragments는 activity와 layout 그리고 view들의 조합이 합쳐진 겁니다. 이 세가지가 합쳐져서 user interface를 가지게 되는 거죠. 예를 들어 디바이스의 가로 세로가 바뀔 때 빈부분을 채워주고 넘치는 부분을 제대로 자리잡게 하기 위해서 이 fragments를 activity 안에 넣어서 사용하는 겁니다. 또한 필요에 따라서는 dynamic 하게 remove 될 수도 있구요.



Fragment1, Fragment2 이렇게 두개의 Fragments를 가지고 있다고 가정합시다. 이 두개의 Fragments는 각각 나름대로의 view들의 조합구성을 가지고 있습니다. 디바이스가 portrait 모드 일 때 두개의 activity를 생성하고 각각 fragment 하나씩을 배치해 놓을 수 있습니다. 그리고 한번에 한가지 activity 를 표시하도록 할 수 있죠. 그리고 디바이스에 따라서 이 두 fragments를 동시에 표시할 수 있다면 (좀 더 큰 디바이스 이거나 세로 방향일 때) 그 화면을 가득 채우기 위해 이 두개의 Fragment들을 한개의 activity에 넣어서 화면을 꽉 채울 수 있죠.

각각의 fragment들은 또한 나름대로의 life cycle과 view hierarchy 를 가지고 있습니다.activity 가 실행되는 동안 이 fragment들을 추가하거나 삭제 할 수 있습니다. 이 fragment들은 activity 의 context 안에 존재합니다.



Understanding the Life Cycle of a Fragment



Fragment를 생성하려면 Fragment 클래스를 extend하고 몇개의 life cycle 콜백 메소드를 implement 해야 합니다. fragment의 라이프 사이클은 해당 activity의 라이프 사이클에 종속 됩니다. 그러니까 activity 가 paused 된 상태이면 그 안의 모든 fragment들도 paused 됩니다. 마찬가지로 activity 가 destroy 되면 그 안의 fragment들도 같이 destroy 됩니다. 이 fragment들의 라이프 사이클에는 몇가지 콜백 메소드들이 포함돼 있습니다.


- onAttach() - activity 에 fragment가 attach 될 때 호출 됨


- onCreate() - fragment를 생성할 때 호출 됨. 이 메소드는 fragment 가 paused 됐거나 stopped 된 후에 다시 resumed 될 때 계속 남아있기를 바라는 fragment의 item들을 초기화 할 때 사용합니다.


- onCreateView() - fragment의 view를 생성하기 위해 호출 합니다.


- onActivityCreated() - 액티비티의 onCreate() 메소드가 return 됐을 때 호출 됩니다.


- onStart() - fragment가 visible하게 됐을 때 호출 됩니다. 이 메소드는 액티비티의 onStart() 메소드와 연관이 있습니다.


- onResume() - fragment가 visible되고 running 할 때 호출 됩니다. 이 메소드는 activity의 onResume() 메소드와 관련이 있습니다.


- onPause() - fragment가 visible 이지만 focus를 받고 있지 않을 때 호출 됩니다. 이 메소드는 activity의 onPause() 메소드와 연관이 있습니다.


- onStop() - fragment가 visible이지 않을 때 호출 됩니다. 이 메소드는 액티비티의 onStop()메소드와 연관이 있습니다.


- onDestroyView() - fragment가 save 되거나 destroy 되어야 할 때 호출 됩니다. view hierarchy가 fragment로부터 remove 됩니다.


- onDestroy() - fragment가 더이상 사용되지 않을 때 호출 됩니다. fragment와 관련된 view hierarchy는 없지만 fragment는 계속 activity에 attach 돼 있습니다.


- onDetach() - fragment가 activity에서 detach될 때 호출 됩니다.  fragment에 할당된 리소스가 release 됩니다.

반응형