Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드 개발 Fragment 생명 주기는 어떻게 되는가?

안드로이드 개발
반응형

Activity Lifecycle 이 있듯이 Fragment 도 생명주기를 가지고 있습니다. 생명주기는 개발자가 알아야 할 가장 기본적이고 중요한 요소입니다. Fragment 를 컨트롤 하기 위해서는 생명주기를 제대로 알고 있어야 하기 때문입니다. Fragment 의 생명주기는 레이아웃에 추가거나 변경할 때 시작합니다. FragmentTransaction 로 추가(add) 변경(replace) 할 때를 말합니다.

 

 

생명주기를 한눈에 볼 수 있는 이미지는 다음과 같습니다. FragmentTransaction add 함수를 통해 onAttach() 를 시작으로 onDetach() 까지 과정입니다. 크게 두 부분으로 나누는데 시작하는 과정과 종료 과정입니다. 시작은 onAttach() ~ onResume() 이며, 종료는 onPause() ~ onDetach() 입니다.

안드로이드 개발 Fragment 생명 주기는 어떻게 되는가?

 

 

먼저 시작 과정에 함수들에 대한 설명을 하겠습니다.

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 화면에 로딩이 끝났을 때 호출 

 

안드로이드 개발 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()

 

안드로이드 개발 Fragment 생명 주기는 어떻게 되는가?

 

 

 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 참고하는 방법

 

반응형
Posted by 녹두장군

댓글을 달아 주세요