21.06.22
공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다.
참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다.
+ 틀린 부분, 수정해야 할 부분은 언제든지 피드백 주세요. 😊
by. ryalya
안드로이드에서 화면에 출력되는 UI구성의 가장 기본 요소는 Activity이다.
안드로이드 수업은 기본적으로 Activity만을 사용했기 때문에, 조별로 안드로이드 프로젝트를 하기 전 까지는 Fragment라는 것을 아예 알지 못했다.
만드려는 앱의 크기가 작고, 기능이 복잡하지 않고 단순하고, 스마트폰 자체에서만 사용할 것이라면 Activity만을 사용해도 상관이 없다.
하지만 Activity는 Fragment에 비해 퍼포먼스면에서 상대적으로 무겁고, 리소스를 많이 잡아 먹는다.
하나의 Activity 내에서 여러개의 Fragment를 독립적으로 구성하고 싶다!
그리고 여러 디바이스(태블릿 등의 큰 화면)에서 공간 낭비 없는 UI를 구성하고 싶다면?
Fragment가 답일 수 있다.
Fragment를 활용하면 간단하게 사용할 수 있는 코드가 복잡해지긴 하지만 메모리 관리에 있어 효율적이고, 화면 전환도 더 순조롭다고 한다.
한 번도 안 써본 사람은 있어도
한 번만 써본 사람은 없다는 Fragment...
대부분의 프로젝트들이 Single Activity - Multi Fragment를 가지고 있다는데 어떤 아이인지 알아보고 구현해보도록 하겠다.
Fragment = Activity + View
구글에서는 액티비티의 모듈식 섹션이라고 정의하고 있다.
쉽게 말하면 Fragment란 하나의 Activity내에서 생성되는
✔ 자체 수명 주기
✔ 자체 입력 이벤트
✔ 액티비티 실행 중 동적으로 생성, 교체, 삭제
✔ 재사용이 가능
하여 Activity의 복잡도를 줄여주면서 UI 변화에 유용하게 사용되는 구조이다.
Fragment의 사용은 한국인이 가장 많이 사용하는 앱인 카카오톡을 예시로 들 수 있다.
아래 탭바에 있는 벡터 아이콘을 클릭하면 우리는 친구 목록, 대화 목록, 뉴스, 쇼핑하기 화면 등 아이콘에 맞는 화면을 볼 수 있다.
전체 화면 자체는 Activity이고, 중간에 바뀌는 부분이 Fragment로 사용될 수 있는 것!
위에서 언급한 특징이 장점으로 연결된다.
→ 기존 Activity보다 더 세분화 되어 있음
Activity가 onCreate()할 때, Fragment는 onAttach()부터 onActivityCreated() 메서드까지 호출한다.
onAttach()
→ Fragment가 Activity에 attach 될 때 호출되는 함수.
호출되면서 인자인 Context를 가지고 부모 Activity에 listener interface를 implement했다면 형변환을 통해 가져올 수 있다.
onCreate()
→ Fragment를 생성할때 onCreate()를 호출한다.
초기화 해야하는 리소스들은 여기서 초기화! + 넘겨준 값들이 있다면 여기서 변수를 넣어주면 됨. 하지만 UI 초기화는 불가.
onCreateView()
→ 레이아웃을 inflate하는 곳. Fragment에 맞는 UI를 그리려면 메서드에서 View를 리턴해야 한다. (여기서 View 객체를 얻을 수 있음.)
Fragment가 UI를 제공하지 않는 경우 null을 반환하면 된다.
onActivityCreated()
→ Activity에서 Fragment를 모두 생성하고 난 다음 호출되는 함수.
Activity의 onCreate()에서 setContentView()한 다음과 유사하다. View(UI)변경 작업이 가능.
onStart()
→ Activity에서의 역할과 비슷하다. 유저에게 Fragment가 보이도록 하는 역할이다. (Activity는 started 상태)
onResume()
→ Fragment가 화면에 보여지는 단계, 사용자에게 포커스를 잡은 상태. 사용자와의 상호작용이 가능하다.
onPause()
→ Fragment의 부모 Activity가 아닌 다른 Activity가 foreground로 나올 때, onPause를 call하고 backstack으로 들어감. (이 메서드를 호출하는 것은 사용자가 Fragment를 떠난다는 첫 번째 신호. Fragment가 소멸 중이라는 뜻은 아님).
현재 사용자가 세션을 넘어서 지속되어야 하는 변경 사항을 적용하려면 이곳에서 해야 한다.
onStop()
→ Fragment는 더이상 보이지 않고, 기능도 할 수 없다.
onDestroyView()
→ Fragment에 View들을 제거할 때 호출되는 함수. 만약 add 할 때 backstack 을 사용했다면, 다시 해당 Fragment로 돌아 올때 onCreateView() 가 호출된다.
onDestroy()
→ fragment를 제거하기 직전에 호출된다.
onDetach()
→ Activity 제거를 완료하고 Activity와의 연결도 해제시킨다.
Activity가 여러 종류를 가지고 있듯이 Fragment도 기본적인 Fragment 클래스 외에 확장할 수 있는 하위 클래스들이 있다.
아래 내용들은 안드로이드 개발자 사이트를 참고했다.
Floating 대화상자를 표시할 수 있다.
이 클래스를 사용하여 대화상자를 생성하면 Activity 클래스의 대화상자 도우미 메서드를 사용하는 것의 좋은 수단이 된다고 한다.
이렇게 하면 Fragment 대화상자를 액티비티가 관리하는 Fragment의 backstack에 통합시킬 수 있어, 사용자가 닫힌 Fragment로 돌아갈 수 있기 때문이다.
어댑터가 관리하는 항목의 목록(예: SimpleCursorAdapter)을 표시(ListActivity와 비슷)
이 클래스는 목록 뷰를 관리하는 데 쓰는 몇 가지 메서드를 제공한다.
예를 들어 onListItemClick() 콜백을 제공하여 클릭 이벤트를 처리. (목록을 표시할 때는 ListView가 아니라 RecyclerView를 사용하는 방법이 선호됨)
이 경우에는 레이아웃에 RecyclerView를 포함한 Fragment를 만들어야 한다.
객체의 계층을 목록으로 표시.
애플리케이션에서 설정 화면을 만드는 데 주로 사용 된다.
아래 예시를 통해 간단한 계층구조를 확인할 수 있다.
<PreferenceScreen
xmlns:app="http://schemas.android.com/apk/res-auto">
<SwitchPreferenceCompat
app:key="notifications"
app:title="Enable message notifications"/>
<Preference
app:key="feedback"
app:title="Send feedback"
app:summary="Report technical issues or suggest new features"/>
</PreferenceScreen>
또한, 아래와 같이 PreferenceFragment를 만들어 계층 구조를 확장할 수 있고,
public class MySettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
}
}
위의 Fragment를 아래처럼 Activity에 추가하여 사용할 수 있다.
public class MySettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings_container, new MySettingsFragment())
.commit();
}
}
Fragment 종류
: https://developer.android.com/guide/components/fragments
Fragment vs Activity
: https://www.charlezz.com/?p=44128
: https://junghun0.github.io/2019/06/08/android-fragment/