눈송이의 개발생활

[Android]Fragment 본문

Android

[Android]Fragment

꾸지새미언니

1. Fragment는 무엇인가?

Activity 내에 생성되는 UI 구성을 여러 개의 모듈 단위로 작성할 수 있도록 해주는 기능
"하위 액티비티" 와 같은 개념

하나의 Fragment를 여러 Activity에서 재사용 가능해서 UI 구성에 소요되는 작업량을 줄일 수 있다.


public class FragmentA extends Fragment {

    public FragmentA() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_a, container, false);
    }
}

✅ onCreateView()

Fragment 실행될 때 호출하는 메소드

  • inflater : view를 그려주는 역할
  • container : 부모의 view

2. Activity에 Fragment 추가하기

1) 동적 변화가 없는 경우

👉 layout xml 사용하기

public class FragmentA extends Fragment {

    public FragmentA() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_a, container, false);
    }
}

fragment_a.xml 파일을 inflate() 메소드에 넣어서 하나의 fragment가 하나의 layout을 갖도록 한다.


2) 앱 실행 중 동적으로 추가/변경하는 경우

👉 FragmentManager 사용해서 ViewGroup에 저장하기

//...Activity.java
protected void onCreate(Bundle savedInstanceState) {
        // ... 
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        fragmentTransaction.add(R.id.fragmentB, new FragmentB());
        fragmentTransaction.commit();
}

FragmentManager and FragmentTransaction 클래스를 사용해야한다.

✅ addToBackStack()

commit() 실행되기 전 상태를 "Back-stack"에 추가할 수 있음
Activity에 의해 관리되고 "뒤로" 버튼을 누르면 이전 상태에 저장된 Fragment 다시 가져올 수 있음

✅ ViewGroup(ViewContainer)

다른 view들을 담고 있고 view를 화면에 배치하기 위해 필요하다.
layout과 view container의 base class이다.
(ex. LinearLayout, RelativeLayout, FrameLayout)


3. Fragment Manager

✅ add()

  • 프래그먼트들을 중첩해서 화면에 보여준다.
  • 'back button' 누르면 모든 fragment들 destroy 됨

✅ add() + addToBackStack()

  • 프래그먼트 중첩해서 화면에 보여줌
  • 'back button' 누르면 stack에 있는 fragment 순서대로 destroy 됨

✅ replace()

  • 기존 생성된 fragment들 destroy되고 1개만 화면에 보여줌
  • 'back button' 누르면 모든 fragment들 destroy 됨

✅ replace() + addToBackStack()

  • 화면에 1개의 fragment만 보여줌
  • stack에 쌓이지만 중첩되지는 않음
  • replace될 때 이전에 생성된 fragment는 onDestroyView 됨
  • 'back button' 누르면 stack에 있는 fragment 순서대로 onCreateView 함

4. Bundle

Bundle은 여러가지 타임의 값을 저장하는 Map 클래스
아무거나 포장할 수 있는 상자라고 생각하면 된다.

Intent도 Bundle을 사용하여 전달되는 것이다.
(bunble이라는 포장 박스를 이용해서 그 안에 intent를 전달한다고 생각하자)

//데이터 보내는 Fragment
Fragment fragment = new UserFragment(); 
Bundle bundle = new Bundle(1); 
bundle.putString("userId", userId); 
fragment.setArguments(bundle);
//데이터 받는 Fragment 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String userId = getArguments.getString("userId"); 
        return inflater.inflate(R.layout.fragment_one, null);
}

✅ new Bundle()

parameter는 전달할 데이터의 개수

✅ put<데이터타입>("key", value)

다양한 데이터 타입의 값들을 bundle에 넣는다.
key와 value로 값을 넘겨주고 받을 때는 key를 사용해서 받는다.

✅ setArguments()

묶어놓은 데이터(bundle)를 다름 fragment로 전달하는 메소드이다.

✅ getArguments.get<메소드타입>()

데이터를 받아 오는 메소드
"key"로 원하는 값들을 가져 온다.


5. Fragment Life Cycle

1. onCreate()

  • 해당 fragment가 사용할 리소스 초기화

2. onCreateView()

  • layout inflate & UI 초기화
  • fragment가 interface 처음으로 그릴 때 실행됨
  • 부모 activity의 onCreate() 호출 후 실행됨

3. onActivityCreated()

  • 부모의 onCreate()종료 후 실행
  • 부모의 view바꾸고 싶으면 이 때 바꿔야함

4. onDestory()

  • 리소스 제거 (Activity와 유사)

5. onDestoryView()

  • fragment가 있던 자리에 다른 fragment가 대체될 때 실행됨
  • fragment의 view 제거

6. onDetach()

  • activity로 부터 분리될 때 실행
  • Fragment는 리소스 만들고 view 만든다.
    view 먼저 제거하고 리소스 제거한다.

참고
https://www.crocus.co.kr/1560
https://recipes4dev.tistory.com/58?category=643521
https://black-jin0427.tistory.com/354
https://velog.io/@jinny_0422/AndroidFragment-생명주기

'Android' 카테고리의 다른 글

[Android]Layout  (0) 2022.01.05
[Android]Activity  (0) 2022.01.05
Comments