Apple is Apple

일일 회고

 

벌써 과제 제출일과 한 주의 마지막이 다 되간다.

 

과제는 얼추 다 정리하였으니 최종 제출을 하고, 내일은 다음주 프로젝트 시작을 위해 약간 쉬어가는 타임을 가지며 공부를 해봐야겠다.



오늘의 키워드

  • 알고리즘
  • Fragment

알고리즘

[[programmers] [Kotlin] 키패드 누르기

문제 설명 스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다. 이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄

aaapple.tistory.com](https://aaapple.tistory.com/77)

Fragment

다양한 크기의 화면을 가지는 기기가 늘어남에 따라 한 화면에 여러 개의 화면 요소를 원하는 수요가 늘어가고 있다. 대표적으로 화면의 크기가 큰 태블릿 PC와 같이 화면의 크기가 큼에 따라 복잡한 레이아웃 구성과 뷰 위젯 배치들로 인해 기존의 Activity를 통한 레이아웃 구성만으로는 구현하기 버거운 면이 있었다.


이를 해결하기위해 나온 것이 안드로이다 3.0부터 추가된 개념인 fragment이다.
프래그먼트는 액티비티 내에서 화면 UI의 일부를 나타낸다.

여러 개의 프래그먼트를 조합하여 액티비티가 출력하는 한 화면의 UI를 표현할 수 있으며, 하나의 프래그먼트를 다른 여러 액티비티에 재사용할 수 있다

프래그먼트는 액티비티와 같이 독립적이로 실행되기 떄문에, 자체적인 생명주기를 갖고있다.
또, 액티비티 실행중에도 다른 fragment로 교체가 가능하다.

기본적으로 한 개의 액티비티에 들어가는 화면 요소를 Fragment 단위로 나누어 관리하기 때문에 레이아웃을 분리 관리할 수 있고, 액티비티의 화면 구성을 위한 레이아웃의 복잡도도 줄일 수 있다.

프래그먼트가 정의한 두 가지 UI 모듈이 태블릿 디자인에서는 하나의 액티비티로 조합될 수 있는 반면, 핸드셋 디자인에서는 분리될 수 있다는 것을 나타낸 예시.

 

프래그먼트 사용법

 

우선, 프래그먼트를 붙일 액티비티를 정한다.
MainActivity를 부모 컴포넌트라고 하고, 여기에 붙일 프래그먼트를 A Fragment,B Fragment라고 하자

먼저, 액티비티 xml에 프래그먼트를 보여줄 레이아웃을 선언한다.

<FrameLayout
  android:id="@+id/fragmentContainer"/>

위와 같이 특정 레이아웃에다 붙혀도 되고, <fragment/> 라는 태그도 있는데, 이것을 사용해도 된다.
<fragment android:name="B Fragnent" ... /> 식으로 파일을 직접 넣어 사용할 수 있다.
그리고 Fragment()를 상속하는 클래스를 만들어 프래그먼트 생명주기에 맞게, UI초기화 , 기타로직등을 작성하면 된다.
(액티비티 생명주기에 맞취 코딩하는 것과 비슷하다.)

// ex)
class HomeFragment : Fragment(R.layout.fragment_home) {}

 

fragment lifecycle

위에서 이야기 했듯이, 프래그먼트도 독립적으로 동작하기 때문에 자체적인 생명주기를 가진다.
프래그먼트의 생명주기를 알아보자.

프래그먼트 생명주기-출처:공식홈페이지


onAttach(): 프래그먼트가 액티비티와 연결되어 있던 경우 호출된다. 여기서 액티비티가 전달된다.

 

onCreate(): 프래그먼트를 생성할 때 호출된다. 프래그먼트가 pause, stop 후 재개되었을 때, 유지해야할 것들을 초기화 해줘야 한다.

 

onCreateView(): 시스템이 사용자 인터페이스를 처음으로 그릴 때 호출된다. 래그먼트에 맞는 UI를 그리려면 메서드에서 View를 반환해야 한다. 이 메서드는 프래그먼트 레이아웃의 루트(시작점)이다. 프래그먼트가 UI를 제공하지 않는 경우 null을 반환하면 된다.

주의 -->

onCreateView()에서 view가 초기화중이기 때문에 충돌이 일어날수 있다. 여기서 레이아웃을 inflate하지만 findViewById등을 사용하여 초기화는 하지 말아야한다.
몇가지 뷰들은 초기화가 되어있지 않을 수 있기 때문이다. 그래서 view가 완전히 생성됐을 때 호출되는 onViewCreated()에서 findViewById등을 통해서 초기화 해주어야한다

.

onViewCreated(): 프래그먼트의 뷰가 완전히 생성된 후 호출된다. 여기서 view 컴포넌트들을 초기화해주는 로직을 작성한다.
ex) viewBinding, recyclerview-viewpager adapter 초기화 등..

 

onViewStateRestored(): 프래그먼트에 속하는 컴포넌트들의 상태값을 모두 읽어왔을 때 호출된다. ex) 버튼이 눌렸는지..

 

onStart(), onResume(), onPause(), onStop(): 이 메소드들은 액티비티 생명주기에 있는 메소드들과 같다. 참고

 

onSavedInstanceState(): 프래그먼트의 상태값이 저장된 후 호출되는 메소드이다. onStop()이 호출 된 후 프래그먼트의 상태가 저장된다.

 

onDestroyView(): 프래그먼트와 연결된 view layer가 제거 되는 중일 때 호출된다.

 

onDetach(): 프래그먼트가 액티비티와 연결이 끊어지는 중에 호출된다.

profile

Apple is Apple

@mjjjjjj