Activity 가 Lifecycle 이 있듯이 Fragment 도 생명주기를 가지고 있습니다. 생명주기는 개발자가 알아야 할 가장 기본적이고 중요한 요소입니다. Fragment 를 컨트롤 하기 위해서는 생명주기를 제대로 알고 있어야 하기 때문입니다. Fragment 의 생명주기는 레이아웃에 추가거나 변경할 때 시작합니다. FragmentTransaction 로 추가(add) 변경(replace) 할 때를 말합니다.
▼ 생명주기를 한눈에 볼 수 있는 이미지는 다음과 같습니다. FragmentTransaction 의 add 함수를 통해 onAttach() 를 시작으로 onDetach() 까지 과정입니다. 크게 두 부분으로 나누는데 시작하는 과정과 종료 과정입니다. 시작은 onAttach() ~ onResume() 이며, 종료는 onPause() ~ onDetach() 입니다.
▼ 먼저 시작 과정에 함수들에 대한 설명을 하겠습니다.
l onAttach() : Fragement 를 Activity 에 attach 할 때 호출, android.support.v4.app.Fragment 에서 deprecated
l onCreate() : 초기화 리소스들이 들어가는 곳
l onCreateView() : Layout 을 inflate 하는 곳, View 객체를 얻어서 초기화
l onActivityCreated() : Fragment 생성 이후 호출 하는 함수
l onStart() : Fragment 화면에 표시될 때 호출
l onResume() : Fragment 화면에 로딩이 끝났을 때 호출
※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다. ※ ▶ 스마트폰 안드로이드 개발을 위한 개발자 모드 켜고 끄는 방법 ▶ 안드로이드 Android 앱 배포를 위한 개발자 등록하기 ▶ 안드로이드 개발 Wear(웨어러블) 앱 프로젝트 만드는 방법 ▶ 스마트폰 개발자옵션 활성화 하는 방법 ▶ 안드로이드 스튜디오 개발 문서 API 참고하는 방법 |
종료 과정의 함수에 대한 설명입니다.
l onPause() : 화면이 중지되면 호출되는 함수
l onStop() : Fragment 화면 삭제
l onDestoryView() : View 리소스 해제
l onDestory() : Fragment 완전히 종료할 때 호출
l onDetach() : Fragment 와 Activity 의 연결고리가 끊길 때 호출
다른 Fragment 를 Add 하면서 기존 Fragment 가 종료되는 과정입니다.
l onPause()
l onStop()
l onDestoryView()
Replace 함수나 backward 로 Fragment 를 삭제하는 경우 실행되는 함수 입니다.
l onDestory()
l onDetach()
▼ Main Activity 소스는 다음과 같습니다. getSupportFragmentManager() 함수로 FragmentManager 객체를 얻어 beginTransaction() 으로 fragment 추가를 시작합니다. 추가 함수는 replace() 입니다. 마지막에 commit() 을 해 주면 반영이 됩니다.
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.contents,new OneFragement());
fragmentTransaction.commit();
}
}
▼ Activity 화면을 구성하고 있는 xml 파일의 내용입니다. id 가 contents 인 <LinearLayout> 에 Fragment 를 추가합니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="gon.com.kakaomanager.MainActivity">
<LinearLayout
android:id="@+id/contents"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>
▼ 다음은 추가한 Fragment 클래스입니다. android.support.v4.app.Fragment 를 사용하고 있습니다.
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class OneFragement extends Fragment {
String mId;
public static OneFragement getInstance(String id) {
OneFragement mFragement = new OneFragement();
Bundle args = new Bundle();
args.putString("id", id);
mFragement.setArguments(args);
return mFragement;
}
@Override
public void onAttach(Activity activity) {
Log.d(this.getClass().getSimpleName(), "onAttach()");
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(this.getClass().getSimpleName(), "onCreate()");
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if (args != null) {
mId = args.getString("id", "");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d(this.getClass().getSimpleName(), "onCreateView()");
return inflater.inflate(R.layout.fragment_contents, null);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
Log.d(this.getClass().getSimpleName(), "onViewCreated()");
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Log.d(this.getClass().getSimpleName(), "onActivityCreated()");
super.onActivityCreated(savedInstanceState);
}
@Override
public void onStart() {
Log.d(this.getClass().getSimpleName(), "onStart()");
super.onStart();
}
@Override
public void onResume() {
Log.d(this.getClass().getSimpleName(), "onResume()");
super.onResume();
}
@Override
public void onPause() {
Log.d(this.getClass().getSimpleName(), "onPause()");
super.onPause();
}
@Override
public void onStop() {
Log.d(this.getClass().getSimpleName(), "onStop()");
super.onStop();
}
@Override
public void onDestroyView() {
Log.d(this.getClass().getSimpleName(), "onDestroyView()");
super.onDestroyView();
}
@Override
public void onDestroy() {
Log.d(this.getClass().getSimpleName(), "onDestroy()");
super.onDestroy();
}
@Override
public void onDetach() {
Log.d(this.getClass().getSimpleName(), "onDetach()");
super.onDetach();
}
@Override
public void onSaveInstanceState(Bundle outState) {
Log.d(this.getClass().getSimpleName(), "onSaveInstanceState()");
super.onSaveInstanceState(outState);
}
}
▼ Fragment 를 구성하는 화면 레이아웃 입니다.
fragment_contents.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:text="Fragement 추가"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/>
</LinearLayout>
※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다. ※ ▶ 스마트폰 안드로이드 개발을 위한 개발자 모드 켜고 끄는 방법 ▶ 안드로이드 Android 앱 배포를 위한 개발자 등록하기 ▶ 안드로이드 개발 Wear(웨어러블) 앱 프로젝트 만드는 방법 ▶ 스마트폰 개발자옵션 활성화 하는 방법 ▶ 안드로이드 스튜디오 개발 문서 API 참고하는 방법 |
'안드로이드 개발' 카테고리의 다른 글
안드로이드 개발 이미지 추가하고 화면에 출력하는 방법 (0) | 2022.10.23 |
---|---|
안드로이드 android.os.NetworkOnMainThreadException 에러, Thread를 사용해야 되는 경우 (1) | 2022.08.02 |
안드로이드(Android) ImageView 에 이미지 회전(Image rotate) 시켜서 세팅하는 방법 (1) | 2022.07.31 |
안드로이드 개발 No cached version available for offline mode 에러 해결하기 (0) | 2022.07.19 |
[Android] 안드로이드 인터넷 이미지 다운로드 해서 ImageView 표현하기 (2) | 2020.07.12 |
안드로이드(Android) 라이브러리 프로젝트 참조 만들기 (0) | 2020.06.23 |
안드로이드 Android 앱 배포를 위한 개발자 등록하기 (0) | 2020.05.01 |
안드로이드 개발 중복 리소스가 나타나서 에러가 발생하는 경우 Multiple implementations resource (0) | 2020.04.08 |