본문 바로가기
Computer Science/Mobile Programming

프래그먼트

by 이은선 2023. 1. 21.
728x90
SMALL

  Activity에 화면 2개를 만드는 법

-> Fragment 파일 2개 추가 + Main Activity

   2개의 xml 파일 추가(Fragment파일 관련) + activity_main.xml 파일( Fragment 등록 필요)

프래그먼트

-레이아웃 안에 부분 화면으로 레이아웃을 넣을 수 있음.

-> 하나의 액티비티에서 화면체를 2개 넣어준다. Fragment도 하나의 액티비티이기 때문에 manifest에 등록할 필요는 없다.

 프래그먼트는 액티비티 내에 배치되어 사용자 인터페이스를 구성하는 안드로이드 구성요소 중 하나입니다. 프래그먼트란 개념이 나온 이유는 안드로이드가 여러 디바이스(태블릿 등) 을 지원하면서 다양한 기기의 화면에 대응할 필요가 있어졌기 때문입니다. 액티비티 내의 일부 영역을 차지하여 사용자 화면을 구성할 수 있으며, 액티비티 내에서 독립적으로 동작한다. , 프래그먼트는 액티비티 내에서 동작하는 안드로이드 구성요소이기 때문에 액티비티 없이는 존재할 수 없다.

 

-태블릿과 같이 큰 화면에서는 한 화면에 여러 부분 화면을 넣는 것이 효율적이다.

 

-프래그먼트는 부분화면을 독립적으로 만들어주며 액티비티를 그대로 본떠 생성한다.

-> 액티비티 안에 여러 개의 프래그먼트가 생성/존재 가능하다. 각각에 대한 화면 처리를 프래그먼트로 만들어놓고, 메소드 호출에 따라 프래그먼트의 실행 여부를 정할 수 있다.

프래그먼트와 액티비티 차이

액티비티는 하나의 화면이며, 액티비티 사이에 화면 전환을 할 경우 인텐트를 통해서 화면 전환이 된다. 프래그먼트는 액티비티 위에서 동작하며, 메소드를 호출하여 프래그먼트 매니저를 통해서 액티비티 위에 있는 다른 프래그먼트로 화면 전환이 된다. 다시 말해, 프래그먼트는 액티비티 위에 있어야만 동작 가능하다.

 

프래그먼트가 액티비티의 프래그먼트 매니저를 통해 의사소통하는 방식


1)     메인액티비티-getFragmentManager() : 매니저 참조하기
2)     beginTransaction() : 트랜젝션 시작
3)     트랜젝션 : 프래그먼트 추가,삭제,교체 작업 수행
4)     commit() : 트랜젝션 실행
 
  • 액티비티 또는 프래그먼트에 컨테이너를 배치하고, 컨테이너에 프래그먼트를 추가/교체/삭제하는 작업을 코드를 통해 수행할 수 있습니다. 이러한 작업을 위해서 Fragment Manager Fragment Transaction이 필요합니다.
  • Fragment Manager는 백 스택을 관리하고 프래그먼트 트랜잭션을 생성합니다.
  • Fragment Transaction은 프래그먼트를 추가/교체/삭제하는 작업을 제공합니다.

 FragmentTransaction 특징

· FragmentTransaction 클래스는 프래그먼트의 추가/변경/삭제 기능을 제공합니다.

· 다수의 프래그먼트를 추가하고 변경하는 액션을 하나의 트랜잭션으로 묶을 수 있습니다.

· FragmentTransaction의 인스턴스는 FragmentManager beginTransaction() 메소드를 통해 획득할 수 있습니다.

val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()

·  각각의 FragmentTransaction은 마지막에 트랜잭션에 대해 반드시 commit을 호출해야 합니다. commit() 메소드는 FragmentManager에게 트랜잭션에 모든 명령이 추가되었다고 알립니다.

· 기본적으로 commit() 메소드는 비동기적이고, 트랜잭션을 즉시 수행하지 않습니다. commit() 호출 시점에 트랜잭션은 메인 스레드에 예약됩니다. 그리고 메인 스레드에서 예약된 트랜잭션의 수행이 가능할 때 트랜잭션이 수행됩니다.

 

Fragment Life Cycle

 

1)    onAttach() : 프래그먼트가 FragmentManager에 추가되고. 호스트 액티비티에 연결될 때 호출된다. 이 시점에 프래그먼트가 활성화되고, FragmentManager은 프래그먼트의 생명 주기를 관리한다.

2)    onCreate() : 프래그먼트가 액티비티의 호출을 받아서 생성된다. 액티비티로부터 Bundle로 데이터가 넘어온다.

3)    onCreateView() :  프래그먼트와 연결된 뷰 계층을 생성하기 위해 호출된다. 시스템은 프래그먼트가 자신의 UI를 처음으로 그릴 시간이 되면 이것을 호출한다.

4)    onActivityCreated() : 액티비티의 onCreate() 메서드가 반환할 때 호출된다.

5)    onStart() : 사용자에게 프래그먼트가 보여질 때 호출된다. , 프래그먼트의 뷰 작업이 완료되어 사용자에게 보여지는 시점에 호출된다.

6)    onResume() : 프래그먼트가 보이고, 사용자와 상호 작용이 가능한 때에 호출된다.

7)   onPause() : 프래그먼트가 포커스를 잃어 사용자와 상호 작용이 불가능해지는 시점에 호출된다. 다른 액티비티가 포그라운드(앞쪽)에 있고 포커스를 갖고 있지만, 이 프래그먼트가 있는 액티비티도 여전히 표시된다.

8)    onStop() : 프래그먼트가 더 이상 보이지 않을 때 호출된다.

9)    onDestroyView() : 프래그먼트와 연결된 뷰 계층이 제거될 때 호출된다. 모든 종료 애니메이션과 전환이 완료된 후 프래그먼트의 뷰가 화면과 분리되는 시점에 호출된다.

10)   onDestroy() : 프래그먼트가 제거되거나 FragmentManager가 파괴(destroy)될 경우 호출된다.

11)    onDetach() : 프래그먼트가 FragmentManage에서 제거되고, 호스트 액티비티에서 떨어질 때 호출된다.


 Fragment Life Cycle 함수 추가 설명

각각의 프래그먼트 객체는 고유의 생명주기를 가집니다. 액티비티와 마찬가지로 사용자의 상호작용에 의해서 생명주기가 바뀝니다. 또한 프래그먼트도 액티비티와 마찬가지로 LifecycleOwner 인터페이스를 구현하고 있어서 Lifecycle 객체를 사용하여 따로 생명주기를 관리할 수 있습니다. 만약 Lifecycle 객체를 사용하지 않는다면 프래그먼트에 선언된 생명주기 콜백 메소드를 사용하면 됩니다.

· 프래그먼트 생성

프래그먼트를 생성하려면 Fragment의 하위 클래스(또는 이것의 기존 하위 클래스)를 생성해야 한다.

onCreate()

프래그먼트를 생성할 때 시스템에서 이것을 호출합니다. 구현 내에서 프래그먼트의 기본 구성 요소 중 프래그먼트가 일시정지되거나 중단되었다가 재개되었을 때 유지하고자 하는 것을 초기화해야 합니다.

onCreateView()

시스템은 프래그먼트가 자신의 사용자 인터페이스를 처음으로 그릴 시간이 되면 이것을 호출합니다. 프래그먼트에 맞는 UI를 그리려면 메서드에서 View를 반환해야 합니다. 이 메서드는 프래그먼트 레이아웃의 루트입니다. 프래그먼트가 UI를 제공하지 않는 경우 null을 반환하면 됩니다.

onPause()

시스템이 이 메서드를 호출하는 것은 사용자가 프래그먼트를 떠난다는 것을 나타내는 첫 번째 신호입니다(다만 항상 프래그먼트가 소멸 중이라는 것을 의미하지는 않습니다). 일반적으로 여기에서 현재 사용자 세션을 넘어서 지속되어야 하는 변경 사항을 커밋합니다(사용자가 돌아오지 않을 수 있기 때문입니다).

· 프래그먼트 수명 주기 처리

프래그먼트의 수명 주기를 관리하는 것은 액티비티의 수명 주기를 관리하는 것과 매우 비슷합니다. 액티비티와 마찬가지로 프래그먼트는 세 가지 상태로 존재할 수 있습니다.

onResume(): 재개됨(Resumed)

프래그먼트가 실행 중인 액티비티에 표시됩니다.

onPause() : 일시정지됨(Paused)

다른 액티비티가 포그라운드(앞쪽)에 있고 포커스를 갖고 있지만, 이 프래그먼트가 있는 액티비티도 여전히 표시됩니다(포그라운드의 액티비티가 부분적으로 투명하거나 전체 화면을 뒤덮지 않습니다).

onStop() : 정지됨(Stopped)

프래그먼트가 보이지 않습니다. 호스트 액티비티가 정지되었거나 프래그먼트가 액티비티에서 제거되었지만 백 스택에 추가되었습니다. 정지된 프래그먼트도 여전히 표시는 됩니다(모든 상태 및 멤버 정보를 시스템이 보존합니다). 하지만 사용자에게는 더 이상 표시되지 않으며 액티비티를 종료하면 이것도 종료됩니다.

 

· 액티비티 수명 주기와의 조화

프래그먼트가 있는 액티비티의 수명 주기는 해당 프래그먼트의 수명 주기에 직접적인 영향을 미칩니다. 따라서 액티비티에 대한 각 수명 주기 콜백이 각 프래그먼트에 대한 비슷한 콜백을 발생시킵니다. 예를 들어 액티비티가 onPause()를 받으면, 해당 액티비티 내의 각 프래그먼트가 onPause()를 받습니다.

하지만 프래그먼트에는 프래그먼트의 UI를 빌드하고 소멸시키는 등의 같은 작업을 수행하기 위해 액티비티와의 고유한 상호작용을 처리하는 몇 가지 수명 주기 콜백이 더 있습니다. 이러한 추가 콜백 메서드는 다음과 같습니다.

onAttach()

프래그먼트가 액티비티와 연결되어 있었던 경우 호출됩니다(여기에서 Activity가 전달됩니다).

onCreateView()

프래그먼트와 연결된 뷰 계층을 생성하기 위해 호출됩니다. 시스템은 프래그먼트가 자신의 사용자 인터페이스를 처음으로 그릴 시간이 되면 이것을 호출합니다.

onActivityCreated()

액티비티의 onCreate() 메서드가 반환할 때 호출됩니다.

onDestroyView()

프래그먼트와 연결된 뷰 계층이 제거되는 중일 때 호출됩니다.

onDetach()

프래그먼트가 액티비티와 연결이 끊어지는 중일 때 호출됩니다.

 

액티비티의 각 연속된 상태에 따라 프래그먼트가 어떤 콜백 메서드를 수신할지 결정된다. 예를 들어 액티비티가 자신의 onCreate() 콜백을 받은 경우, 해당 액티비티 안에 있는 프래그먼트는 onActivityCreated() 콜백을 받는다. 액티비티가 재개된 상태에 도달하면 자유자재로 프래그먼트를 액티비티에 추가하거나 액티비티에서 제거해도 된다. 따라서 액티비티가 재개된 상태에 있는 동안에만 프래그먼트의 수명 주기를 독립적으로 변경할 수 있다. 그러나 액티비티가 재개된 상태를 떠나면 액티비티는 다시 프래그먼트를 그 수명 주기 안으로 넣습니다.

728x90
LIST

'Computer Science > Mobile Programming' 카테고리의 다른 글

비동기 처리 스레드  (0) 2023.01.21
안드로이드 메뉴  (0) 2023.01.21
안드로이드 액티비티 라이프 사이클  (0) 2023.01.21
인텐트  (0) 2023.01.21
안드로이드 뷰와 레이아웃  (0) 2023.01.21