눈송이의 개발생활
[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 |