[Doit! 안드로이드 앱 프로그래밍] Fragment

1 분 소요


참고서적: Doit 안드로이드 앱 프로그래밍


Fragment

구글에서 Fragment를 다음과 같이 정의하고 있다.

프래그먼트는 자체 수명 주기를 가지고, 자체 입력 이벤트를 받으며, 액티비티 실행 중에 추가 및 제거가 가능한 액티비티의 모듈식 섹션이라고 생각하면 됩니다(다른 액티비티에 재사용할 수 있는 “하위 액티비티”와 같은 개념)

Fragment의 등장배경에는 태블릿과 같은 큰화면의 등장이 있다.

태블릿과 같은 큰화면은 기존에구성하던 UI방식으로 모두표현하기 어려웠고, 이를 해결하기위해 Fragment 가 등장했다.

또한, 액티비티들로 여러개의 화면을 부분화면을 구성한다면, 여러가지 리소스들을 포함하는 액티비티들로 많은 분할화면을 만드는것은 리소스의 낭비를 야기하는 비효율적인 방법이된다.

이와달리 Fragment는 일종의 모듈과같은 단위로 구성되어서, 액티비티들간에 재사용이 가능하여 화면전환이나 분할화면을 구현하는 UI방식에서 리소스낭비를 줄이고,작업량을 줄일수있어 큰장점을 가지는 중요한 UI구성방식이다.

그래서 큰화면의 단말을 지원하기위해 시작됫던 Fragment는 단말크기와 상관없이 화면UI를 구성하기위해 많이 사용되고 있다.

Fragment의 사용방법

  1. Fragment를 위한 XML 레이아웃 만들기
  2. 프래그먼트 클래스 만들기
  3. 액티비티에 Fragment 추가

예제로 위의 과정을 설명해보자. 액티비티 위에서 프래그먼트 두개의 전환으로 화면전환을하는 UI를 구성하는 예제이다.

1.Fragment 를 위한 XML 레이아웃 만들기 Fragment는 액티비티와 비슷한 구조를 가진다. (XML 레이아웃과 자바소스파일을 가짐) 버튼하나와 텍스트뷰하나를 구성시킨다. 텍스트뷰의 text에는 메인프래그먼트로 하고 버튼의 text로는 메뉴화면으로 라고하고 각각의 textsize를 30sp로 한다.

Fragment_1

1-1. 메뉴Fragment를 위한 XML 레이아웃 만들기 1에서 만든 XML레이아웃을 복사하여 res/layout에 붙여넣기 한후, background 속성에 원하는색을 지정해준다.

fragement_2

  1. 프래그먼트 클래스 만들기 onCreateView() 메소드를 재정의하여 Layoutinflater 객체의 inflate() 메소드로 inflation 한 ViewGroup 객체를 return 해준다. onCreateView() 메소드는 프래그먼트와 관련되는 뷰 계층을 만들어서 리턴하는 메소드로, 반환된 뷰객체로 그뷰의 위젯객체들에 접근할수잇게된다. 즉, 프래그먼트의 뷰객체가 메모리에 올라가게 되는부분이다.

만들어진 프래그먼트의 버튼에 리스너를 등록해서, 버튼이 눌렷을때 액티비티에 정의된 onFragmentChanged() 메소드를 호출하여 파라미터로 0을주어서 메뉴 프래그먼트로 전환하도록 한다.

이때, 액티비티에 정의된 메소드를 호출한다는것을 유의하자.

프래그먼트는 시스템의 제어하에 intent객체를 전달하고 전달받아 화면의 전환을 구현했던 액티비티의 전환과 달리, 액티비티 위에서 동작하여 액티비티에 정의된 메소드를 호출하여 다른프래그먼트로 전환하는 화면전환효과를 만들어낸다.

따라서, 각각의 프래그먼트들은 서로독립적이며, 다른액티비티에서도 호출받아 재사용성이 있게된다.

2-1. 메뉴 프래그먼트 클래스만들기 메인프래그먼트의 소스파일을 복사하여 같은위치에 붙여넣기 해준다. 후에 onFragmentChanged() 메소드의 호출 파라미터부분에 1을 주어서 메인프래그먼트로 전환하도록 구현한다.

  1. 액티비티에 Fragment 추가하기 액티비티에 Fragment를 추가하는 방법에는 두가지가 있다.
    1. XML 레이아웃을 사용하여 추가하기
    2. Java소스파일에서 FragmentManager 를사용하여 추가하기

2-1까지의 부분에서가 XML 레이아웃을 사용하여 추가한 방법이고, 버튼의 리스너 이벤트로 프래그먼트의 전환을 구현하는부분은 FragmentManager를 사용하여 프래그먼트를 추가하는 부분이다.

메인 프래그먼트는 메인액티비티의 XML상에 추가되어있기 때문에 FragmentManager 객체의 findFragmentById() 메소드를 사용하여 찾아 변수에 할당해준다. (프래그먼트는 뷰가 아니기때문에 findViewById()메소드로 찾을수없다)

메뉴프래그먼트는 new연산자를 통해 객체를 생성하여 변수에 할당해준다.

후에 프래그먼트를 바꾸기위해 리스너에 등록하는 메소드인 onFragmentChanged()를 구현한다.

FragmentManager 를 가져오는 메소드인 getSupportFragmentManager() 메소드를 사용하며, 트렌젝션을 사용하여 프래그먼트의 전환을 야기하는 replace() 를 commit()을통해 실행시킨다.

모든 상세코드는 깃허브주소 에있다.

태그:

카테고리:

업데이트:

댓글남기기